小心!#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可以发现,即使加了括号,也不能改变这种运算顺序。

 

另一段问题代码,如下图,编译都不能通过:

 

所以,不要忘了关键的括号,不然害人不浅。

posted @   duanguyuan  阅读(4572)  评论(4编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示