0

この数学が C のマクロで機能しないのはなぜですか?

#include <stdio.h>

#define FOO 6
#define BAR 32
#define MULT FOO * BAR

main() {
    int x = 28296;
    int y = x / MULT;
    printf("%d / %d = %d\n", x, MULT, y);

    return 0;
}

この結果は次のとおりです。

28296 / 192 = 150912

なんで147じゃないの?変数 "int mult" を MULT に設定し、その変数を式 ( int y = x / mult) で使用すると、期待どおりに動作します。

4

2 に答える 2

4

#defineコンパイル前にコードを置き換えるようにプリプロセッサに指示するため、実際には次のようになります。

int y = x / 6 * 32;

* および / 演算子は同じ優先順位を持ち、左から右に評価されるため、(x/6) * 32 が得られます。コンパイラは x を認識しているため、おそらくこの計算を行うでしょう。

代わりに、このようなマクロを定義するときは括弧を使用してください

于 2013-10-26T19:11:46.557 に答える
2

マクロを括弧で囲みます:

#define MULT (FOO * BAR)

これで 147 になります。

取得する理由150912は、マクロ展開後、式が次と同等になるためです。

y = 28296 / 6 * 32;

したがって、 として評価され28296/6、 が乗算され32ます。

@kevin が指摘しているように、このような驚きを避けるために、一般的にはブラケットFOOを配置することをお勧めします。BAR

于 2013-10-26T19:10:20.840 に答える