我正在阅读斯坦福的this教程,他们说:
常见的编码错误:
宏定义中的括号不正确
#define min(a, b) a<b?a:b // incorrect
#define min(a, b) (((a)<(b))?(a):(b)) // correct
我甚至在一个程序中运行它,它工作正常。
任何人都可以解释他们想说的话!
答案 0 :(得分:4)
如果将第一个版本与其他运算符结合使用,则第一个版本会失败:
min(a , b) + c
并转换为:
a<b?a:b+c
与:
相同a<b?a:(b+c)
这是一个意外的结果,给出了起始括号。
第二个版本要好得多。它会对其中一个参数进行两次评估,如果函数或i++
传递给宏,则会导致意外行为。
应该使用内联函数而不是那些宏。