C言語の基礎

#define DEBUG 0
#ifdef DEBUG
    printf("A\n");
#endif
#if DEBUG
    printf("B\n");
#endif

上のコードを main 関数の中に書いて実行したときの出力として、正しいものはどれか。

  1. AA だけが表示される
  2. B何も表示されない
  3. CA と B が表示される
答えと解説を見る

正解:A. A だけが表示される

#ifdef DEBUG は、DEBUG というマクロが定義されているかどうかだけを調べ、値は見ません。DEBUG は値0で定義されているので条件は真になり、A を表示する文がコンパイルされます。#if DEBUG は値を調べ、0なので偽になり、B を表示する文は取り除かれます。デバッグ用の処理を切り替えるときは、#ifdef と #if のどちらで判定するかをそろえておかないと、このような食い違いが起こります。

  • A. 正しい。#ifdef は定義されているかどうかだけを、#if は値を調べます。
  • B. #ifdef は、値が0でも定義されていれば真になります。
  • C. #if DEBUG は DEBUG の値が0なので偽になり、B の文は取り除かれます。
この分野を解く 分野ページへ

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

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

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

  1. マイコンの出力レジスタを、上のように宣言して使っている。この宣言についての説明として、正しいものはどれか。
  2. C言語の規格でいう未定義動作の説明として、正しいものはどれか。
  3. int と unsigned int は32ビットとする。次のうち、C言語の規格で未定義動作になるものはどれか。
  4. 上の関数を gcc で最適化を有効にしてコンパイルすると、if (p == NULL) の判定が削除されることがある。その理由として正しいものはどれか。
  5. C言語の規格で、int型の大きさについて定められていることとして、正しいものはどれか。