首页 > 解决方案 > 我无法理解 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..)
}

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

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

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

标签: c

解决方案


当你有这个:

#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)


推荐阅读