そのようなマクロ定義を書いた、または書きたいと思ったクラスメートはいますか?
2つ以上の数値の積を求めます:#define SQU(x)x * x
しかし、このように書くとどうなるでしょうか。
おっと、もう100ではありません。SQU(10)とSQU(5 + 5)は同等ではありませんか?5 + 5 10ではありませんか?
実際、SQU(10)とSQU(5 + 5)はここでは同等ではありません!
その理由は、マクロ定義の本質はテキストの置換であるためです。そのため、前処理期間中に、SQU(5 + 5)コードが5 + 5 * 5 + 5のマクロに置き換えられました。その結果、乗算の優先度が加算よりも高いため、ご想像のとおり5 + 25 +5になります。
したがって、この問題を解決する方法は、次のように、xに括弧を追加して全体を作成することです。
それは解決することができます。
しかし、これは無限ではありません!
同様に、2つの数値の合計を計算する場合はどうでしょうか。引き続き確認します。
通常の書き込みで、トラップはトリガーされません。キーが正しいからといって、問題がないわけではありません(ただし、各xには括弧があります)。
誰もがこのように書こうとします:
エマ!なぜ20 * 20 400ではないのですか?
マクロの本質に従って、展開して見てみましょう:10 + 10 * 10 + 10 = 120
それは別の優先事項であり、別の罠であり、防御するのは難しいです!
それを解決する方法は?回答:100です。括弧を追加するだけです。
次のように記述します:#define ADD(x)((x)+(x))
このように書いても問題ありません!あなたのマクロは決して侵入しません!