2016-09-01 33 views
-1

我期望输出(或愚蠢的值)为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; 
} 

回答

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

请记住,宏是正好取代(取代)到代码。

3

该宏被直接插入来代替THING

THING * THING4+2 * 4+24 + (2 * 4) + 2如果你想要得到的结果是36比你需要定义宏包裹在括号中这是14

#define THING (4 + 2) 
2

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

2

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

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

所以,一旦你使用了括号,这是因为它成为修复它:

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

这说明in this preprocessor tutorial