C 宏定义中的括号不正确

C 宏定义中的括号不正确,c,macros,C,Macros,我在读斯坦福大学的教程,他们说: 常见的编码错误: 宏定义中的括号不正确 #define min(a, b) a<b?a:b // incorrect #define min(a, b) (((a)<(b))?(a):(b)) // correct #define min(a,b)a如果将第一个版本与其他运算符组合,则该版本将失败: min(a , b) + c 并转化为: a<b?a:b+c aEither表单不好。正确的方法是 int min(int a,int

我在读斯坦福大学的教程,他们说:

常见的编码错误:

宏定义中的括号不正确

#define min(a, b) a<b?a:b // incorrect
#define min(a, b) (((a)<(b))?(a):(b)) // correct

#define min(a,b)a如果将第一个版本与其他运算符组合,则该版本将失败:

min(a , b) + c 
并转化为:

a<b?a:b+c 

aEither表单不好。正确的方法是<代码> int min(int a,int b){返回,你必须考虑宏不是函数,它们只是字面上替换你定义的文本,所以如果你要在更复杂的情况下使用它们,正如某人已经指出的,你会发现一些问题的可复制的,这是否回答了你的问题?“它对其中一个参数求值两次,这可能导致未定义的行为"不,这对于这种特定情况是不正确的。在第一个操作数和第二个或第三个操作数的求值之间有一个序列点。如果传递了i++,则未扩展的行为是因为三元运算符在那里,对吗?或者它与宏有关。@GauravArora不,这是因为类似宏的函数通常是不安全的,并且非常糟糕的做法。@Lundin谢谢。我已经修复了答案。@GauravArora类似于宏的函数没有类型安全性,它可能会导致优先级错误(这正是你的导师所暗示的)它允许任何类型的副作用被传递,它们很难阅读,很难调试,很难维护。当你尝试了所有其他方法时,像宏一样的功能总是最后的选择。
a<b?a:(b+c)