2016-12-10 7 views
-3
#include<stdio.h> 
#define SQ(x) ((x)*(x)) 

main() 
{ 
    int i = 1; 
    while(i<=5){ 
     printf("result : %d\n", SQ(i++)); 
    } 
} 

実行ウィンドウ:Cマクロ - 意図しない結果

結果:2 結果:12 結果:

結果:1 結果:4 結果30

私はそれを意図:9 結果:16 結果:25

このコードはどのように修正する必要がありますか?

+0

そしてなぜ –

+0

'のために(I = 1をint型;私は= 5を<;私は++)を教えてくださいのprintf("結果=%d \ n "、SQ(i));' –

答えて

0

マクロは複数回その引数を評価することができます。これは、#defineがテキストで代用され、C言語の規則を考慮しないためです。プリプロセッサはi++が二回行われ、一度はないされ、この式で

((i++)*(i++)) 

SQ(i++)を置き換えます。

これは、#defineの使用をお勧めしない理由です。あなたが望むふるまいのために、代わりに通常の関数を書く。または、iの引数でSQを呼び出し、そして唯一の呼び出しの後、i++を書く:

SQ(i); 
i++; 
1

SQ(i++) -> (i++)*(i++)

使用この:

printf("result : %d\n", SQ(i)); 
i++; 
関連する問題