プリインクリメント演算子を使用している間、マクロ関数のこの奇妙な動作に気付きました。私はマクロで前インクリメント演算子を使用することは好ましくない知っているが、それでも私は、次の2つのコードの実行の背後にある理由を知りたいのですが:Cでのマクロと前後のインクリメント
#include <stdio.h>
#define SQR(x) {x*x }
int main()
{
int a=4;
int b=SQR(a++);
int c=SQR(++a);
printf("%d.....%d....%d\n",b,c,a*b*c);
return 0;
}
これの出力は次のとおりです。
20.....64....10240
最初の値bは20ですが、これは4 * 5でも問題ありません。しかし、なぜCの値が64、すなわち7 * 8ではなく8 * 8であるのか?
そして私はちょうどこのような実行の順序を置き換え:
#include <stdio.h>
#define SQR(x) {x*x }
int main()
{
int a=4;
int c=SQR(++a);
int b=SQR(a++);
printf("%d.....%d....%d\n",b,c,a*b*c);
return 0;
}
これの出力は次のとおりです。
42.....36....12096
ストレンジはそれではないでしょうか?プリインクリメントには再び問題がありました。それは5 * 6の代わりに42すなわち6 * 7を与え、その後、ポストインクリメントは6 * 7の代わりに間違った答え、すなわち6 * 6を与えた。
誰もが出力がこのような理由を説明できるのであれば、大きな助けになるでしょうか?あなたのコード
SQR(a++)
がundefined behaviorを呼び出すint c = ++a*++a;
へ
a++ * a++
と、int c=SQR(++a);
のようなものに展開されますので。
定義されていない動作 – Danh
マクロが行うことについてOPが混乱する可能性があるため、http://stackoverflow.com/questions/949433/why-are-these-constructs-using-undefined-behaviorと重複していませんSourav Ghoshの答え)。 –
ちょっと@ダン実際にこの質問は私の試験の一つで尋ねられたので、私は答えを得るために幾分あるべきだと思った。 – user7297996