为什么这段 c++ 代码需要加这对括号才正确运行,是编译器问题吗
1个回答
展开全部
对于你这个用法只要改一下加个括号就可以了
#define max(a,b) (a>b?a:b)
这是因为C++中的宏定义是一种预编译处理,也就是在编译之前替换所有宏。
cout<<max(a,b);这一行在编译前就会被预处理成
cout<<a>b?a:b;
然后再编译。这时候编译器认为a是<<的一个操作数,然后>是另外一个操作符。这就和你的本意不符了。
加上()后编译器就知道怎么理解这句语句了。
另外C++中的宏是从C中继承过来的,使用的时候有很多限制和注意事项。上面加了()后的宏定义在你这个语境可以正常工作,但是到更复杂的语境就会出错了。更严密一点儿的写法是
#define max(a,b) ((a)>(b)?(a):(b))
这样可以应对类似这样的应用场景
int a;
a = max(5+6, 8+7);
但是这样之后还是会有更复杂的语境会出问题,这里不继续列举了。总之使用宏要很小心,最好少用或者用inline函数代替。
以上回答你满意么?
#define max(a,b) (a>b?a:b)
这是因为C++中的宏定义是一种预编译处理,也就是在编译之前替换所有宏。
cout<<max(a,b);这一行在编译前就会被预处理成
cout<<a>b?a:b;
然后再编译。这时候编译器认为a是<<的一个操作数,然后>是另外一个操作符。这就和你的本意不符了。
加上()后编译器就知道怎么理解这句语句了。
另外C++中的宏是从C中继承过来的,使用的时候有很多限制和注意事项。上面加了()后的宏定义在你这个语境可以正常工作,但是到更复杂的语境就会出错了。更严密一点儿的写法是
#define max(a,b) ((a)>(b)?(a):(b))
这样可以应对类似这样的应用场景
int a;
a = max(5+6, 8+7);
但是这样之后还是会有更复杂的语境会出问题,这里不继续列举了。总之使用宏要很小心,最好少用或者用inline函数代替。
以上回答你满意么?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询