我无法理解C语言中宏函数的结果
-- 您好,我不明白为什么“#define max(a,b) (a>b)?(a):(b)”不能按我的预期工作。
#include<cstdio>
#define max(a,b) (a>b)?(a):(b)
int main(void){
printf("%dn",max(3,5)); // result = 5 (work correctly)
int a = 3 + max(3,5);
printf("%dn",a); // result = 3 (work incorrect and i don`t know why..)
}
我不知道为什么变量 + 宏不起作用。
但是,在这种情况下,“#define max(a,b) ((a>b)?(a):(b))”工作正常。即使是 var + 宏的情况。
请任何人澄清这一点.. thx。
回答
当你有这个时:
#define max(a,b) (a>b)?(a):(b)
你这样写:
int a = 3 + max(3,5);
这扩展为:
int a = 3 + (a>b)?(3):(5)
因为+具有比更高的运算符优先级?,这实际上是:
int a = (3 + (a>b)) ? (3) : (5)
而且由于3 + (a>b)总是要评估为真实值,因此结果将始终为3.
通过将整个扩展放在括号中:
#define max(a,b) ((a>b)?(a):(b))
你得到:
int a = 3 + ((a>b)?(3):(5))
因为外括号将三元运算符表达式组合在一起,所以您会得到预期的结果。
请注意,当@zwol 在评论中写道时,您实际上应该像这样编写宏:
#define max(a,b) (((a)>(b))?(a):(b))
周围的额外括号a和b用于(a)>(b)防止这种运算符优先级问题。
- 请注意,在 `(a<b)` 中的 `a` 和 `b` 周围应该有额外的括号。