2017-01-26 7 views
0

なぜこの出力は8ですが、出力は10ではありませんか?以下のコードを実行すると、出力は8になります。しかし、私はそれが10であるべきであると感じている。誰もここに何が起こるか説明できますか?

#include <stdio.h> 
#define A 2 + 3 
#define B 2 

int main() 
{ 
    printf("Hello, World!\n"); 
    printf("%d\n", A * B); 
    return 0; 
} 
+1

マクロの展開方法は知っていますか? –

+0

「A」と「B」を交換すると驚くでしょう... –

+3

今私はソーシャルメディアで「3 + 9 * 2の結果はどうですか? –

答えて

1

これは、マクロのかっこが重要な理由です。

マクロは単純なテキスト置換を行います。だから、マクロ処理した後、あなたのコードは次のようになります。乗算の優先順位が高いため、

int main() 
{ 
    printf("Hello, World!\n"); 
    printf("%d\n", 3 + 9 * 2); 
    return 0; 
} 

、乗算が最初に発生するので、結果はマクロでputtingsの括弧21

になります、あなたはよあまりの驚きを持っている:

#define A (3 + 9) 
#define B (2) 

これは、その結果:

int main() 
{ 
    printf("Hello, World!\n"); 
    printf("%d\n", (3 + 9) * (2)); 
    return 0; 
} 

これは24を出力します。

4

#defineプリプロセッサディレクティブはテキスト置換に過ぎません。そのようなあなたのprintfが* 3 2が6に等しいように、8です

printf("%d\n", 2 + 3 * 2); 

なるとABは2を追加し、変数ではありません。この問題を解決し、10を取得するには8

に等しく、周り()を置きますあなたのディレクティブ

#define A (2 + 3) 
#define B 2 

これはあなたのprintf

に拡大します

プリプロセッサは、コンパイルの前に物事を展開する方法あなたはgccclang

-Eフラグを渡すことができます表示するにはしかし、よりよい解決策は、これらの定数のためconst intまたはenumを使用することです。

const int A = 2 + 3; 
const int B = 2; 

// or 
enum { A = 2 + 3, B = 2 }; 
+0

申し訳ありませんが、私はそれが間違って質問したことに気づいた* しかし、私はあなたが意味することを理解しました。 ありがとう –

+0

@AntonHその更新に感謝 –

+0

@RyanHaining私の喜び:) – AntonH

0

あなたは9 * 2 + 3を実行しています。あなたの番号がどれくらいあるか分かりません。

0

マクロprintf("%d\n", 3 + 9 * 2);として膨張こうして出力21であり、また8も10

0

マクロ膨張を前処理の4相で起こる:

  • 前処理
      直接ibが実行され、 マクロ呼び出しが展開されます、_Pragma単項演算子式が実行されます(...)
  • したがって、各マクロは、その定義に正確にA展開されます - >3 + 9B - printf("%d\n", 3 + 9 * 2);

    を結果>2

    を今すぐ構文的発現を分析するために、コンパイラの役割を付属しており、意味論的に、コンパイル時にはおそらくC言語の優先順位演算子に基づいて21に評価されます。

    movl $.LC1, %edi //first argument of printf "%d\n" 
    movl $0, %eax // second argument of printf 21 
    call printf