我正在处理以下代码:
#include <stdio.h>
# define CONSTANT 5+7
int main()
{
int y = 5;
int z = 10;
y = CONSTANT / y;
printf("y= %d\n", y);
z /= CONSTANT;
printf("z= %d\n", z);
}
我理解z = 10 / 12
= 0
这是我为z
获得的输出。但y = 12 / 5
= 2
应该是答案,但我得y = 6
。为什么会这样?
答案 0 :(得分:3)
恭喜发现宏最危险的一面:它们是文本替换,而不是真正的表达。因此,编译器将您的代码视为
y= 5 + 7 / y;
应用标准的优先规则,并获得六个。
如果无法避免表达式的预处理器定义,请使用括号:
#define CONSTANT (5+7)
答案 1 :(得分:3)
y = CONSTANT / y;
扩展为y = 5+7 / y;
。
而且,/
运算符的优先级高于+
运算符,因此首先计算7 / y
,它等于1
。因此,y
将等于5 + 1
,等于6
。
答案 2 :(得分:1)
执行clang -E main.c
(仅指预处理):
int main()
{
int y = 5;
int z = 10;
y = 5+7 / y;
printf("y= %d\n", y);
z /= 5+7;
printf("z= %d\n", z);
}
问题现在应该是显而易见的。定义宏时,我们通常使用括号来避免此类错误:#define CONSTANT (5+7)
答案 3 :(得分:0)
您需要在括号中定义宏,如#define CONSTANT (5+7)
,否则首先执行除法,它将类似于y = 5 +(7/5),即5+(1)= 6。