これが私が持っているものであり、これがどのように機能し、実際に何をするのか疑問に思います。
#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つの整数を生成します。
それはどのようにそれをしますか?
これが私が持っているものであり、これがどのように機能し、実際に何をするのか疑問に思います。
#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つの整数を生成します。
それはどのようにそれをしますか?
これが発生する理由は、マクロが印刷を次のように展開するためです。
printf("%d %d\n", j+5*5, (j+5)*5);
意味:
1+5*5 and (1+5)*5
まだ言及されていないため、この問題を修正する方法は次のようにすることです。
#define FTIMES(x) ((x)*5)
x
マクロ展開内の括弧は、演算子の結合性の問題を防ぎます。
その後の質問に対する答えは、操作の順序です。
FTIMES(j + 5)= 1 + 5 * 5 = 26
FTIMES((j + 5))=(1 + 5)* 5 = 30
コンパイラーの前処理は、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を取得する理由がわかります。
そして、あなたがそれを修正したい場合:
#define FTIMES(x) ((x) * 5)
プリプロセッサは、コード内のすべてのNUMオカレンスを5に置き換え、すべてのFTIMES(x)をx*5に置き換えます。次にコンパイラはコードをコンパイルします。
その単なるテキスト置換。
操作の順序。
FTIMES(j + 5)ここで、j=1は次のように評価されます。
1 + 5 * 5
これは:
25 + 1
= 26
FTIMES((j + 5))を作成することにより、次のように変更しました。
(1 + 5)* 5
6 * 5
30