我无法理解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))

周围的额外括号ab用于(a)>(b)防止这种运算符优先级问题。

  • 请注意,在 `(a&lt;b)` 中的 `a` 和 `b` 周围应该有额外的括号。

以上是我无法理解C语言中宏函数的结果的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>