为什么在C中使用以下宏函数会导致1而不是2?

为什么在C中使用以下宏函数会导致1而不是2?,c,macros,C,Macros,我有一个带宏的简单C代码: #include <stdio.h> #define MAX(x, y) x>y ? 1 : 0 int main() { int i = 9; printf("%d\n", MAX(10, i) + 1); return 0; } #包括 #定义最大(x,y)x>y?1 : 0 int main(){ int i=9; printf(“%d\n”,最大值(10,i)+1); 返回0; } 现在我理解了宏函数,如果x的

我有一个带宏的简单C代码:

#include <stdio.h>
#define MAX(x, y) x>y ? 1 : 0

int main() {
    int i = 9;
    printf("%d\n", MAX(10, i) + 1);
    return 0;
 }
#包括
#定义最大(x,y)x>y?1 : 0
int main(){
int i=9;
printf(“%d\n”,最大值(10,i)+1);
返回0;
}
现在我理解了宏函数,如果x的值(10)大于y的值(在本例中为9),那么宏将返回1或0。因此,在将1添加到宏的最终结果之后,上述输出不应该是2而不是1吗?

更改
#定义MAX(x,y)x>y?1:0
#定义最大值(x,y)(x>y?1:0)
可以解决问题

C宏将在进入编译器之前被直接替换,这意味着条件表达式将变成
x>y?1:0+1
,两个分支都将变为
1

运算符优先级使
+1
进入条件表达式,而不是在条件表达式之后。在这种情况下,需要使用括号强制执行优先级

始终添加括号以防止宏中出现此类意外行为被认为是一种很好的做法。有关完整的详细信息,请参阅

更改
#定义最大(x,y)x>y?1:0
#定义最大值(x,y)(x>y?1:0)
可以解决问题

C宏将在进入编译器之前被直接替换,这意味着条件表达式将变成
x>y?1:0+1
,两个分支都将变为
1

运算符优先级使
+1
进入条件表达式,而不是在条件表达式之后。在这种情况下,需要使用括号强制执行优先级

始终添加括号以防止宏中出现此类意外行为被认为是一种很好的做法。有关完整的详细信息,请参阅

MAX(10,i)+1
完全替换为
10>i?1:0+1
这两种情况下都是1,因为
+
的优先级高于
?:

一般来说,在替换和变量周围放置
()

#define MAX(x, y) ((x)>(y) ? 1 : 0)
为了避免优先级问题。

MAX(10,i)+1
完全替换为
10>i?1:0+1
这两种情况下都是1,因为
+
的优先级高于
?:

一般来说,在替换和变量周围放置
()

#define MAX(x, y) ((x)>(y) ? 1 : 0)

避免优先级问题。

但为什么会这样?@dikshant C的设计者认为这种方式比另一种好option@M.M对于使用汇编语言的人来说,宏是很好的技巧。但是随着时间的推移,计算机变得越来越强大,宏的使用越来越少。@NeoX我说的是
+
与条件运算符的优先级(我想这就是“dikshant”的意思)但是为什么会这样呢?@dikshant,C的设计者认为这种方式比另一种好option@M.M对于使用汇编语言的人来说,宏是很好的技巧。但是随着时间的推移,计算机变得越来越强大,宏的使用越来越少。@NeoX我说的是
+
与条件运算符的优先级(我想这就是“dikshant”的意思)宏不是函数,它们不会返回东西。宏是文本替换(实际上是标记替换)。在使用站点插入实际的宏文本,用
10
i
文本替换
x
y
。请注意,
MAX
不是这个宏的好名称,因为我希望它返回
x
y
,以较大者为准。也许
大?宏不是函数,也不会返回东西。宏是文本替换(实际上是标记替换)。在使用站点插入实际的宏文本,用
10
i
文本替换
x
y
。请注意,
MAX
不是这个宏的好名称,因为我希望它返回
x
y
,以较大者为准。也许
大于