首页 > 试题广场 >

请写一个严谨的宏”MAX”,返回两个参数中较大的一个:[$#

[填空题]
请写一个严谨的宏”MAX”,返回两个参数中较大的一个:1
#define Max(a,b) (((a)>(b))?:(a):(b))
编辑于 2019-11-08 15:52:47 回复(5)
#define MAX(A,B) ((A)>(B)?(A):(B))
发表于 2021-12-23 12:15:56 回复(0)
 #define MAX(a,b) ((a):(b)?(a):(b))
//参考答案不严谨,define 的执行规则是直接将a、b代入算式,也就是它并不会自己打括号,当a、b的算式有加减运算时,会按照符号优先级规则直接运算,所以要全部打括号

发表于 2021-07-29 16:20:39 回复(1)
#define MAX(a,b) (a>b)?a:b
发表于 2019-09-25 16:19:50 回复(3)
#define MAX(a,b) ((a) > (b) ? (a) : (b) )
发表于 2022-03-08 19:19:51 回复(0)
#define MAX(A,B) (A>B?A:B)
这个可以在codeblocks上运行
发表于 2020-08-23 19:03:13 回复(1)
#define MAX(AB)(A>B?A:B)
发表于 2023-06-20 15:07:36 回复(0)
 #define MAX(a,b) ({ typeof(a) _a = a; typeof(b) _b = b; (void)(&a == &b); ((_a) > (_b) ? (_a) : (_b)); })
Linux 内核写法
发表于 2022-06-22 13:12:21 回复(0)
 #define MAX(a,b) ((a)>(b)?(a):(b))
发表于 2021-08-03 14:33:03 回复(0)
#define MAX(a, b) do{a>b? a: b }while(0)
发表于 2023-10-21 00:23:52 回复(0)
#define MAX(A,B) ((A)>(B)?(A):(B))
发表于 2023-10-12 23:58:28 回复(0)

参考答案才不对好吧

一少括号
二不严谨,例如: MAX(i++, j++)直接爆炸

这个GCC的写法就比较好

#define MAX(a, b)  (
 {
   typeof(a) val1 = (a);
   typeof(b) val2 = (b);

   val1 > val2 ? val1 : val2;   
 }
)

```

发表于 2023-03-29 16:27:38 回复(0)
 #define MAX(x,y) ((x) >= (y) ? (x) : (y)), 我这哪里有错呀
发表于 2021-11-16 10:35:20 回复(0)
参考答案才是错误吧
 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
发表于 2021-08-09 20:28:22 回复(0)
比较严谨的定义是#define MAX(a,b) ((a)>(b)?:(a):(b))。
请注意整个宏以及宏定义中的a、b都必须加括号,否则用在表达式中会出问题。
例如:
如果整个宏没有加括号,那么由于加法的优先级比?:高,所以MAX(a,b)+1只有在a<=b时才加1;
如果a或b没有加括号,那么当a或b包含优先级比大于低的运算符时会有问题,比如MAX(a&15,b)相当于a&(15>b)?a&15:b,这时不再是比较哪个参数更大,而是判断a&(15>b)的结果是否为零来决定返回哪个参数。

因此要让宏严谨,就必须加上所有的括号。不过上面给出的定义仍然存在一个问题,就是当参数的求值包含副作用时,副作用会被执行多次。
比如调用MAX(a++,b)时,如果a++>b,那么a最终会被加2。
对此,我并不知道有什么标准的方法来解决这个问题,除非把宏改成内联函数。
不过利用GCC扩展的语句表达式功能,可以把宏定义成:
#define MAX(a,b) ({__typeof__(a) a1=(a);__typeof__(b) b1=(b);a1>b1?a1:b1;})
这样就能保证参数只求值一次,但这一方法的缺点是不保证在所有编译器中都可用。
发表于 2021-07-27 17:41:15 回复(0)
#define MAX((A),(B)) ((A)>(B) ? (A):(B)) 
发表于 2021-05-20 14:24:49 回复(0)
 #define MAX((a), (b)) ((a) > (b)) ? (a) : (b)
为啥不对
发表于 2021-02-17 22:32:33 回复(0)
 MAX(X,Y) (X)>(Y)?(X):(Y)  ()防止宏定义陷阱就可以了吧
发表于 2020-11-24 13:23:57 回复(0)
#define Max(a,b) (((a)>=(b))?(a):(b))
发表于 2020-08-20 16:45:15 回复(0)