不了解输出是如何生成的

时间:2016-09-01 02:05:23

标签: c c-preprocessor parentheses operator-precedence

我希望输出(或傻的值)为36。但我得到的是14。当我添加括号时,这是固定的:#define THING (4+2)

但我仍然想知道没有括号时发生了什么以及为什么我得到14的输出 。 以下是我的代码:

#include <stdio.h>
#include <stdlib.h>

#define THING 4+2

int main(void)
{

    int silly = THING * THING;
    printf("%d", silly);

    return EXIT_SUCCESS;
}

4 个答案:

答案 0 :(得分:3)

THING*THING = 4+2*4+2 = 4+(2*4)+2 // because of higher precedence of * than +
            = 4+8+2 = 14.

请记住,MACRO完全被替换(替换)到代码中。

答案 1 :(得分:3)

宏插入代替THING

THING * THING 4+2 * 4+24 + (2 * 4) + 2,即14。

如果您希望结果为36,则需要定义括在括号中的宏:

#define THING (4 + 2)

答案 2 :(得分:2)

因为宏(几乎)与文本替换相同。预处理器将int silly = THING * THING;转换为int silly = 4+2 * 4+2;,操作顺序表示处理为4 + (2 * 4) + 2,而不是(4 + 2) * (4+ 2)

答案 3 :(得分:2)

您需要括号,因为操作顺序是干扰的。宏只是替换文本,因此没有括号,操作不会按预期的顺序进行评估。

THING * THING ----> 4 + 2 * 4 + 2 = 14

所以,一旦你使用括号,这就解决了它,因为它变成了:

THING * THING ----> (4 + 2) * (4 + 2) = 36

这解释为in this preprocessor tutorial