3

これが私が持っているものであり、これがどのように機能し、実際に何をするのか疑問に思います。

#define NUM 5
#define FTIMES(x)(x*5)

int main(void) {
    int j = 1;
    printf("%d %d\n", FTIMES(j+5), FTIMES((j+5)));
}

26と30の2つの整数を生成します。

それはどのようにそれをしますか?

4

7 に答える 7

17

これが発生する理由は、マクロが印刷を次のように展開するためです。

printf("%d %d\n", j+5*5, (j+5)*5);

意味:

1+5*5 and (1+5)*5
于 2009-01-26T19:05:09.933 に答える
12

まだ言及されていないため、この問題を修正する方法は次のようにすることです。

#define FTIMES(x) ((x)*5)

xマクロ展開内の括弧は、演算子の結合性の問題を防ぎます。

于 2009-01-26T19:08:35.700 に答える
3

defineは単なる文字列置換です。

その後の質問に対する答えは、操作の順序です。

FTIMES(j + 5)= 1 + 5 * 5 = 26

FTIMES((j + 5))=(1 + 5)* 5 = 30

于 2009-01-26T19:07:18.760 に答える
2

コンパイラーの前処理は、FTIMESを検出した場所で置換を実行し、コードをコンパイルします。したがって、実際には、コンパイラが認識するコードは次のとおりです。

#define NUM 5
#define FTIMES(x)(x*5)

int main(void)
{

    int j = 1;

    printf("%d %d\n", j+5*5,(j+5)*5);
}

次に、オペレーターの好みを考慮に入れると、26と30を取得する理由がわかります。

于 2009-01-26T19:06:51.600 に答える
1

そして、あなたがそれを修正したい場合:

#define FTIMES(x) ((x) * 5)
于 2009-01-26T19:09:42.810 に答える
0

プリプロセッサは、コード内のすべてのNUMオカレンスを5に置き換え、すべてのFTIMES(x)をx*5に置き換えます。次にコンパイラはコードをコンパイルします。

その単なるテキスト置換。

于 2009-01-26T19:06:25.207 に答える
0

操作の順序。

FTIMES(j + 5)ここで、j=1は次のように評価されます。

1 + 5 * 5

これは:

25 + 1

= 26

FTIMES((j + 5))を作成することにより、次のように変更しました。

(1 + 5)* 5

6 * 5

30

于 2009-01-26T19:06:46.500 に答える