简单C代码中的意外输出

时间:2016-08-01 03:14:01

标签: 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);

}

我理解z = 10 / 12 = 0这是我为z获得的输出。但y = 12 / 5 = 2应该是答案,但我得y = 6。为什么会这样?

4 个答案:

答案 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。