简单C代码中的意外输出
我正在编写以下代码:简单C代码中的意外输出,c,C,我正在编写以下代码: #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); } #包括 #定义常数5+7 int main() { int y=5; int z=10; y=常数
#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);
}
#包括
#定义常数5+7
int main()
{
int y=5;
int z=10;
y=常数/y;
printf(“y=%d\n”,y);
z/=常数;
printf(“z=%d\n”,z);
}
我理解
z=10/12
=0
这是我为z
获得的输出。但是y=12/5
=2
应该是答案,但我得到y=6
。为什么会这样?祝贺你发现了宏最危险的一面:它们是文本替换,而不是真正的表达式。因此,编译器将您的代码视为
y= 5 + 7 / y;
应用标准优先规则,并得到6
如果无法避免表达式的预处理器定义,请使用括号:
#define CONSTANT (5+7)
y=常数/y代码>扩展为y=5+7/y代码>
而且,/
运算符的优先级高于+
运算符,因此首先计算7/y
,它等于1
。因此,y
将等于5+1
,这等于6
执行clang-E main.c
(这意味着仅预处理):
现在问题应该很明显了。定义宏时,我们通常使用括号来避免这样的错误:#定义常量(5+7)
您需要在括号中定义宏,如#定义常量(5+7)
否则首先执行除法,它将如y=5+(7/5),即5+(1)=6。常量
不是12
。您将其定义为5+7
。首先是宏展开,因此y=5+7/y
,即y=5+(7/y)
。你可能应该使用const
或者至少把5+7
放在括号里。你确定你知道常数5+7的结果是什么吗?要把这一点弄清楚,你可能需要读一读我写过的关于这一点的文章。
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);
}