C言語の基礎

#define SQUARE(x) x * x
int a = 3;
printf("%d\n", SQUARE(a + 1));

#define で定義したマクロ SQUARE を使う上のコードを実行したときの出力として、正しいものはどれか。

  1. A7
  2. B10
  3. 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) と考えた場合の値です。マクロは括弧を補わずに置き換えます。
この分野を解く 分野ページへ

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

C言語の基礎のほかの問題

  1. ヘッダファイル sensor.h を上のように書いた。#ifndef、#define、#endif の3行の目的として、正しいものはどれか。
  2. 上のコードを main 関数の中に書いて実行したときの出力として、正しいものはどれか。
  3. マイコンの出力レジスタを、上のように宣言して使っている。この宣言についての説明として、正しいものはどれか。
  4. C言語の規格でいう未定義動作の説明として、正しいものはどれか。
  5. int と unsigned int は32ビットとする。次のうち、C言語の規格で未定義動作になるものはどれか。