C言語の基礎
#define SQUARE(x) x * x
int a = 3;
printf("%d\n", SQUARE(a + 1));#define で定義したマクロ SQUARE を使う上のコードを実行したときの出力として、正しいものはどれか。
- A7
- B10
- C16
答えと解説を見る
正解:A. 7
マクロは、プリプロセッサが文字の並びをそのまま置き換えるだけです。SQUARE(a + 1) は a + 1 * a + 1 に展開され、掛け算が先に計算されるので、3 + 3 + 1 = 7 になります。意図どおり (a + 1) の2乗の16にするには、#define SQUARE(x) ((x) * (x)) のように引数と全体を括弧で囲みます。それでも SQUARE(i++) のように副作用のある引数では i++ が2回評価されて未定義動作になるので、インライン関数を使う方法もあります。
- A. 正しい。a + 1 * a + 1 と展開され、3 + 3 + 1 = 7 です。
- B. SQUARE(a) + 1、つまり 3 × 3 + 1 と読み違えた場合の値です。
- C. (a + 1) × (a + 1) と考えた場合の値です。マクロは括弧を補わずに置き換えます。