なぜこの出力は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;
}
なぜこの出力は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;
}
これは、マクロのかっこが重要な理由です。
マクロは単純なテキスト置換を行います。だから、マクロ処理した後、あなたのコードは次のようになります。乗算の優先順位が高いため、
が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を出力します。
#define
プリプロセッサディレクティブはテキスト置換に過ぎません。そのようなあなたのprintf
が* 3 2が6に等しいように、8です
printf("%d\n", 2 + 3 * 2);
なるとA
とB
は2を追加し、変数ではありません。この問題を解決し、10
を取得するには8
に等しく、周り()
を置きますあなたのディレクティブ
#define A (2 + 3)
#define B 2
これはあなたのprintf
が
プリプロセッサは、コンパイルの前に物事を展開する方法あなたはgcc
かclang
に-E
フラグを渡すことができます表示するにはしかし、よりよい解決策は、これらの定数のためconst int
またはenum
を使用することです。
const int A = 2 + 3;
const int B = 2;
// or
enum { A = 2 + 3, B = 2 };
申し訳ありませんが、私はそれが間違って質問したことに気づいた* しかし、私はあなたが意味することを理解しました。 ありがとう –
@AntonHその更新に感謝 –
@RyanHaining私の喜び:) – AntonH
あなたは9 * 2 + 3を実行しています。あなたの番号がどれくらいあるか分かりません。
マクロprintf("%d\n", 3 + 9 * 2);
として膨張こうして出力21であり、また8も10
マクロ膨張を前処理の4相で起こる:
前処理 直接ibが実行され、 マクロ呼び出しが展開されます、_Pragma単項演算子式が実行されます(...)
したがって、各マクロは、その定義に正確にA
展開されます - >3 + 9
とB
- 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
マクロの展開方法は知っていますか? –
「A」と「B」を交換すると驚くでしょう... –
今私はソーシャルメディアで「3 + 9 * 2の結果はどうですか? –