#include<stdio.h>
#define mul(p,q) p*q
int main(){
int a=5;
printf("%d",mul(a+3,a-2));
return 0;
}
これは24枚プリントが期待されていましたが、18枚ありました。どうしてですか?MACROSはどのようにCで動作しますか?
#include<stdio.h>
#define mul(p,q) p*q
int main(){
int a=5;
printf("%d",mul(a+3,a-2));
return 0;
}
これは24枚プリントが期待されていましたが、18枚ありました。どうしてですか?MACROSはどのようにCで動作しますか?
基本的には、コンパイルする前に見つけて置き換えてください。あなたのコードではなく、あなたが#define mul(p,q) ((p)*(q))
を行う必要があり#define mul(p,q) p*q
の
int main(){
int a=5;
printf("%d",a+3*a-2);
return 0;
}
になります。それであなたのコードは以下のようになり、あなたは期待される答えを得るでしょう。
int main(){
int a=5;
printf("%d",((a+3)*(a-2)));
return 0;
}
プリプロセッサがコードに驚くようなことをするたびに、前処理された出力を調べることで、それが何であるかを知ることができます。 Unixyコンパイラで、-E
コマンドラインオプションを使用:
$ gcc -E test.c | sed -ne '/main/,$p'
int main(){
int a=5;
printf("%d",a+3*a-2);
return 0;
}
(sedのビットはstdio.h
を含めることによって生成される無関係な材料の線の数千を除去することである)
をマクロ展開は
を生産していますprintf("%d",a+3*a-2);
今、驚くべき回答が得られた理由は分かりますか?
これは、人々がCプリプロセッサで持っている非常に一般的な問題です。 GNU CPPマニュアルには、 "Operator Precedence Problems"というタイトルのセクション全体があります。短いバージョンはあなたのマクロ定義が
#define mul(p,q) ((p)*(q))
のようになっていなければなりません。プリプロセッサ 'cpp'を実行し、その出力を見てどのように動作するかを理解することができます。 –
「これは24を印刷すると思っていましたが、18があります。なぜそれが起こっていますか?」と書く方が良いでしょう。あなたが書いたとおり、コンパイラが誤動作していると思うようです。おそらくこれは言語上の設計上の誤りですが、修正することはできません。また、デバッグの際には、間違いを犯したという前提で常に始めるべきです。ライブラリにバグを発見したわけではありませんまたはコンパイラを使用します。 – zwol