Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单C代码中的意外输出_C - Fatal编程技术网

简单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);

}