不理解输出是如何生成的

not understanding how the output is generated

我希望输出(或 silly 的值)为 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;
}
THING*THING = 4+2*4+2 = 4+(2*4)+2 // because of higher precedence of * than +
            = 4+8+2 = 14.

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

宏是字面上插入的 THING

THING * THING4+2 * 4+24 + (2 * 4) + 2 即 14.

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

#define THING (4 + 2)

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

您需要括号,因为运算顺序会干扰。宏只是替换文本,因此没有括号,操作不会按预期顺序计算。

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

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

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

这里有解释in this preprocessor tutorial