C言語マクロ定義トラップ(#define SQU(x)((x)+(x)))

そのようなマクロ定義を書いた、または書きたいと思ったクラスメートはいますか?

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))

ここに写真の説明を挿入
このように書いても問題ありません!あなたのマクロは決して侵入しません!

おすすめ

転載: blog.csdn.net/weixin_44093867/article/details/97400934