我无法理解 C 语言中宏函数的结果

Gyu*_*Han 1 c

-- 您好,我不明白为什么“#define max(a,b) (a>b)?(a):(b)”不能按我的预期工作。

#include<cstdio>
#define max(a,b) (a>b)?(a):(b)
int main(void){   
  printf("%d\n",max(3,5)); // result = 5 (work correctly)
  int a = 3 + max(3,5);
  printf("%d\n",a); // result = 3 (work incorrect and i don`t know why..)
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么变量 + 宏不起作用。

但是,在这种情况下,“#define max(a,b) ((a>b)?(a):(b))”工作正常。即使是 var + 宏的情况。

请任何人澄清这一点.. thx。

lar*_*sks 6

当你有这个时:

#define max(a,b) (a>b)?(a):(b)
Run Code Online (Sandbox Code Playgroud)

你这样写:

int a = 3 + max(3,5);
Run Code Online (Sandbox Code Playgroud)

这扩展为:

int a = 3 + (a>b)?(3):(5)
Run Code Online (Sandbox Code Playgroud)

因为+具有比更高的运算符优先级?,这实际上是:

int a = (3 + (a>b)) ? (3) : (5)
Run Code Online (Sandbox Code Playgroud)

而且由于3 + (a>b)总是要评估为真实值,因此结果将始终为3.


通过将整个扩展放在括号中:

#define max(a,b) ((a>b)?(a):(b))
Run Code Online (Sandbox Code Playgroud)

你得到:

int a = 3 + ((a>b)?(3):(5))
Run Code Online (Sandbox Code Playgroud)

因为外括号将三元运算符表达式组合在一起,所以您会得到预期的结果。


请注意,当@zwol 在评论中写道时,您实际上应该像这样编写宏:

#define max(a,b) (((a)>(b))?(a):(b))
Run Code Online (Sandbox Code Playgroud)

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

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