c - 我无法理解 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。
解决方案
当你有这个:
#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)
推荐阅读
- postgresql - 为什么我在尝试登录我的 postgres 数据库时收到“致命:用户身份验证失败”?
- android - ArrayList 不能设置为模型类
- angular - 导出的动画未定义
- sql-server - 如何结合索引和列存储索引?
- html - 移动浏览器上的 Chrome v.66 自动播放
- mysql - Mysql:查找重复事件的开始
- javascript - 自动完成文本框在 asp.net 中不起作用
- json - 将 JSON 数据从 DocumentDB(或 CosmosDB)移动到 Azure Data Lake
- git - 阻止所有分支的 git force push
- ios - 在整个应用程序的 iOS 应用程序中删除后退按钮的标题或文本