小心!#define max(a,b) a>b?a:b
今天做oj的时候,定义了两个宏:
//wrong code
#define max_2(a,b) a>b?a:b #define max_3(a,b,c) (a>b?a:b)>c?(a>b?a:b):c
然后程序结果总是WA,仔仔细细检查程序的逻辑一遍又一遍,都快抓狂了,最后终于发现是我定义的两个宏有问题。改为如下就AC了:
#define max_2(a,b) (a>b?a:b) #define max_3(a,b,c) ((a>b?a:b)>c?(a>b?a:b):c)
对的,就是差两个括号,没有括号,因为优先级不一样,造成运算顺序并不是我们预期的那样,运算结果错误。
下边是分析过程:
先上两段有问题的代码:
#include <iostream> #define max_2(x,y) x>y?x:y using namespace std; int main() { int a=max_2(1,2)+3; int b=max_2(2,1)+3; int c=max_2(1,2); int d=max_2(2,1); int e=(max_2(2,1)+3); cout<<a<<" "<<b<<endl; cout<<c<<" "<<d<<endl; cout<<e<<endl; return 0; }
运行结果:
从程序中变量c、d可以发现,max_2(x,y)里不论x、y的顺序如何,max_2(x,y)能够返回正确的结果;
从程序中变量a、b可以发现,运算顺序跟max_2(x,y)里x、y的顺序有关,当x>y时,程序先将max_2(2,1)的结果赋给b,而不是加3之后再赋给b;
从程序中变量e可以发现,即使加了括号,也不能改变这种运算顺序。
另一段问题代码,如下图,编译都不能通过:
所以,不要忘了关键的括号,不然害人不浅。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix