2016-09-01 13 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+2は、あなたがあなたのマクロは、括弧に包まれた定義する必要があるよりも、結果は36になりたい場合は14

ある4 + (2 * 4) + 2です:

#define THING (4 + 2) 
2

マクロがあるので(ほとんど)テキストの置換と同じです。 int silly = THING * THING;は、プリプロセッサによってint silly = 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を説明しています。

関連する問題