不理解输出是如何生成的
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 * THING
是 4+2 * 4+2
是 4 + (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
我希望输出(或 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 * THING
是 4+2 * 4+2
是 4 + (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