转自:https://blog.csdn.net/baidu_33725271/article/details/69478782

方法一: 利用三重条件运算符

#include <stdio.h>
#define MIN(A,B) ( (A) > (B) ? (B) : (A) )
#define MAX(A,B) ( (A) > (B) ? (A) : (B) )

int main(void)
{
printf("%d\n",MIN(,));
printf("%d\n",MAX(,)); return ;
}

值得关注的是
1 . 宏定义的变量在引用的时候,用 ()括起来,防止预处理器展开的错误。
2 . (a > b ? action1 : action2 ) 这样的方式和 if —else 结果一样,但他会使得编译器产生更优化的代码,这在嵌入式编程中比较重要。

方法二: typeof 关键字

#include <stdio.h>

#define MIX(X,Y) ({\
typeof(X) x_ = (X);\
typeof(Y) y_ = (Y);\
(x_< y_)? x_:y_;\
})
#define MAX(X,Y) ({\
typeof(X) x_ = (X);\
typeof(Y) y_ = (Y);\
(x_>y_)? x_:y_;\
})
int main(int argc, char const *argv[])
{
int num1,num2; printf("input two numbers:");
scanf("%d %d",&num1,&num2);
printf("mix is %d,max is %d\n",MIX(num1,num2),MAX(num1,num2));
return ;
}

值得借鉴的是

1 . typeof 关键字 用于获得变量的数据类型 。

2 . 宏定义的实现,用 { } 作为宏整体,里面是一个代码块,语句用 ; 隔开 。

3 . 当宏的实现长度很长的时候,使用换行符 \ 换到下一行 。

4 . 使用输入数据的类型定义局部变量 x_ 和 y_ 实现对原始数据的保护。

5 . 宏实现,不能用 ; 结尾

其他参考:https://zhidao.baidu.com/question/1703790750415801020.html

C++之宏定义实现两个数最值的更多相关文章

  1. 请定义一个宏,比较两个数的a、b的大小,不能使用大于、小于、if语句

    请定义一个宏,比较两个数的a.b的大小,不能使用大于.小于.if语句 方法一:    #define max(a,b) ((((long)((a)-(b)))&0x80000000)?(b): ...

  2. C语言宏定义取得两数的最大值和最小值

    /*本程序时为了验证用宏来做 * 两个数的大小比较的写法*/#include<stdio.h>#define MAX(x,y) ((x)<(y)?(y):(x))#define MI ...

  3. c语言实现交换两个数的值

    C语言中要实现交换两个数的值,可以有很多种方法,具体如下所述. 不使用中间变量: // 异或, a^=b^=a^=b; a ^= b; b ^= a; a ^= b; // 加减 a = a + b; ...

  4. C语言交换两个数的值

    #include<stdio.h> int main() { //交换两个数的值 // 方法一 可读性最好 ; ; int temp ; temp = a; a = b; b = temp ...

  5. java中不创建使用第三方变量,交换两个数的值

    1.直接使用算术运算法交换 先把两个数的和赋值给其中一个,然后做减法.例如num1=num1+num2; 此时num2(交换之后)就等于num1减去num2:废话不多说,直接上代码 public cl ...

  6. 请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句

    提供一种算法: #define max(a, b) ((((a)-(b)) + fabs(a-b))?(a):(b))

  7. C/C++宏定义交换两个值

    #define SWAP(t,a,b) \ do{ \ t c = a; \ a = b; \ b = c; \ }); void main() { ,b=; SWAP(int,a,b); }

  8. php不用第三个变量,交换两个数的值

    //字符串版本 结合使用substr,strlen两个方法实现 $a="a"; $b="b"; echo '交换前 $a:'.$a.',$b:'.$b.'< ...

  9. c语言函数实现交换两个数的值

    代码: #include <stdio.h> void swap(int x,int y) { int temp; temp = x; x = y; y = temp; printf(&q ...

随机推荐

  1. c 语言 volatile 关键字

    一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没 ...

  2. Losing session data in ASP.NET

    Losing session data in ASP.NET By default Response.Redirect terminates thread execution and there mi ...

  3. Java Freemarker生成word

    Java Freemarker生成word freeMaker 简介: FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代 ...

  4. mac 密码重置

    首先请开机或重新启动系统,在电脑刚启动时,请按下键盘上的 command+S 组合键不动, 接下来会在屏幕上看到一串串的命令字符显示,当进入安全模式以后,会看到 一个 root 开始的命令行输入端口. ...

  5. Java-技术专区-虚拟机系列-内存模型(JMM)

           Java8内存模型—永久代(PermGen)和元空间(Metaspace) 一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部 ...

  6. JSON 和 xml 浅读

    1. JSON数据格式 JSON 语法是 JavaScript 对象表示法语法的子集. 数据在名称/值对中:名称是字符串,使用双引号表示.值可以是:数字(整数或浮点数),字符串(在双引号中),数组(在 ...

  7. Python之循环遍历

    range() 快输生成序列 利用 items()提取字典元素 在Python里,for循环后面是可以接一个else 的,在for循环正常结束时候,else 语句会被执行(while循环也是一样哦), ...

  8. 安装FTP

    yum install vsftpd -y cd /etc/vsftpd/ touch login.txt vim login.txt db_load -T -t hash -f /etc/vsftp ...

  9. myEclipse 搭建 Spring boot+myBatis+maven 项目流程

    1.新建一个工程 new-->maven project-->next-->next-->在filter中搜索webapp-->group id.Artifact id- ...

  10. shell只读变量