2016-12-14 14 views
0

プリインクリメント演算子を使用している間、マクロ関数のこの奇妙な動作に気付きました。私はマクロで前インクリメント演算子を使用することは好ましくない知っているが、それでも私は、次の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);のようなものに展開されますので。

+0

定義されていない動作 – Danh

+0

マクロが行うことについてOPが混乱する可能性があるため、http://stackoverflow.com/questions/949433/why-are-these-constructs-using-undefined-behaviorと重複していませんSourav Ghoshの答え)。 –

+0

ちょっと@ダン実際にこの質問は私の試験の一つで尋ねられたので、私は答えを得るために幾分あるべきだと思った。 – user7297996

答えて

2

マクロは、テキストの交換ですについて詳しくは、の部分を詳しく説明するために、よく書かれたこの回答を参照してください。

+0

です。最初の関数のために少なくともatleastの答えを得る方法はありません。私の試験の1つに入った – user7297996

+1

@ user7297996 nopes、UB is ... UB。それでおしまい。 –

+0

よろしくお願いします。ウルの助けをありがとう – user7297996

関連する問題