C言語クイズ解答 - マクロ




2014蟷エ10譛医h繧雁倶ココ縺ョ譁ケ繧貞ッセ雎。縺ォ縲ヾtudy C辟。譁呎署萓帙r髢句ァ九@縺セ縺励◆縲
C險隱槭r蜍牙シキ荳ュ縺ョ譁ケ縺ッ縲∝ュヲ鄙偵サ謨呵ご縺ォ譛驕ゥ縺ェC險隱槭う繝ウ繧ソ繝シ繝励Μ繧ソ縺ョStudy C繧剃スソ縺」縺ヲ縺ソ縺ヲ縺上□縺輔>(蛟倶ココ縺ョ譁ケ縺ッ辟。譁吶〒縺)縲
螟ァ蟄ヲ繝サ鬮伜ーゅサ鬮俶。縺ェ縺ゥ縺ョ謨呵ご讖滄未縺ァ縺ョ謗。逕ィ螳溽クセ繧ょ、壽焚縺ゅk繝ュ繝ウ繧ー繧サ繝ゥ繝シ蝠蜩ヾtudy C縺後∝倶ココ蜷代¢縺ォ辟。譁呎署萓帙r蟋九a縺セ縺励◆縲
繧、繝ウ繧ソ繝シ繝励Μ繧ソ縺ョ謇玖サス縺輔↓蜉縺医√ご繝シ繝繧3D繧ソ繝シ繝医Ν繧ー繝ゥ繝輔ぅ繝繧ッ縺ァ讌ス縺励¥蜍牙シキ縺励◆繧翫→縲,險隱槭ョ蟄ヲ鄙偵r蠑キ蜉帙↓繧オ繝昴シ繝医@縺セ縺吶
繝悶Ο繝繧ッ蟠ゥ縺励ご繝シ繝 3D繝繝ェ繝シ 繧ッ繝ェ繧ケ繝槭せ繝繝ェ繝シ
縺セ縺溘√%縺ョ繧医≧縺ェ繝懊ち繝ウ縺ョ逕ィ諢上&繧後※縺繧九壹シ繧ク縺ァ縺ッ縲∵軸霈峨@縺ヲ縺繧九励Ο繧ー繝ゥ繝繧担tudy C縺ォ逶エ謗・繝ュ繝シ繝峨@螳溯。後@縺溘j縺吶k縺薙→縺後〒縺阪∪縺吶
Study C縺ォ繝ュ繝シ繝峨☆繧 Study C縺ォ繝ュ繝シ繝峨@邱ィ髮縺吶k Study C縺ォ繝ュ繝シ繝峨@螳溯。後☆繧
Study C辟。譁吝茜逕ィ縺ォ縺、縺縺ヲ縺ョ隧ウ邏ー縺ッ縲√%縺ョ繝壹シ繧ク繧貞盾辣ァ縺励※縺上□縺輔>縲



与えられた値を3倍にして4を加える計算をおこなうためにCALCというマクロを定義しました。 与える値は変数nに2を加えたものとします。nに1を代入して試してみると(式に与える値は1+2=3)期待する値13ではなく11になってしまいました。 どこに問題があるか考えてみてください。

#define CACL(x)		x * 3 + 4

	n = 1;
	printf("%d\n", CALC(n+2));
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...


*** 以下は解答です ***



マクロに関する代表的な問題です。 上記のCALC(n+2)を式として展開すると次のようになります。
  n+2 * 3 + 4

また、nに1を代入すると

  1+2 * 3 + 4 = 11

となってしまいます。期待している式は

  (n+2) * 3 + 4

です。(...)が無いため結果が異なってしまいます。
結果が期待通りになるようにするためにはマクロ定義を次のように変更します。

#define CACL(x)		(x) * 3 + 4
マクロを使用すると思わぬところで(...)の問題に遭遇することがあります。 このようなことがないようにマクロの引数はすべて(...)で囲んでしまうとよいでしょう。
例)
#define CACL(x, y, z)		(x) * 3 + 4 + (y) + (z)