2016-09-01 74 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