#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
このコードはどのように修正する必要がありますか?
#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
このコードはどのように修正する必要がありますか?
マクロは複数回その引数を評価することができます。これは、#define
がテキストで代用され、C言語の規則を考慮しないためです。プリプロセッサはi++
が二回行われ、一度はないされ、この式で
((i++)*(i++))
でSQ(i++)
を置き換えます。
これは、#define
の使用をお勧めしない理由です。あなたが望むふるまいのために、代わりに通常の関数を書く。または、i
の引数でSQ
を呼び出し、そして唯一の呼び出しの後、i++
を書く:
SQ(i);
i++;
SQ(i++) -> (i++)*(i++)
使用この:
printf("result : %d\n", SQ(i));
i++;
そしてなぜ –
'のために(I = 1をint型;私は= 5を<;私は++)を教えてくださいのprintf("結果=%d \ n "、SQ(i));' –