我希望输出(或傻的值)为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;
}
答案 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+2
是4 + (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