C言語の基礎

unsigned int reg = 0x04;
if (reg & 0x04 == 0x04)
    printf("ON\n");
else
    printf("OFF\n");

レジスタの値 reg のビット2が1かどうかを調べるつもりで、上のコードを書いた。実行したときの結果として、正しいものはどれか。

  1. AONと表示される
  2. BOFFと表示される
  3. C&と==を続けて書くことはできないので、コンパイルエラーになる
答えと解説を見る

正解:B. OFFと表示される

C言語では、比較の == のほうが、ビットごとの論理積の & より優先順位が高くなっています。そのため条件は reg & (0x04 == 0x04) と解釈され、0x04 == 0x04 が1になるので、0x04 & 1 = 0 で偽になり、OFFと表示されます。意図どおりにするには、(reg & 0x04) == 0x04 のように括弧を付けます。文法としては正しいのでエラーにはなりませんが、gcc の -Wall では警告が出ます。

  • A. == が先に計算されるので、条件は reg & 1 になり、0で偽です。
  • B. 正しい。reg & (0x04 == 0x04) と解釈され、0x04 & 1 = 0 になります。
  • C. 文法としては正しい式なので、コンパイルはできます。gcc の -Wall では警告が出ます。
この分野を解く 分野ページへ

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

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

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

  1. uint8_t は8ビットの符号なし整数型である。上のコードを実行したときの出力として、正しいものはどれか。
  2. uint8_t は8ビットの符号なし整数型である。x を10回増やす上のコードを実行したときの出力として、正しいものはどれか。
  3. unsigned char は8ビット、int は32ビットとする。上のコードを実行したときの出力として、正しいものはどれか。
  4. uint8_t は8ビットの符号なし整数型、int は32ビットとする。上のコードを実行したときの結果として、正しいものはどれか。
  5. int と unsigned int は32ビットとする。上のコードを実行したときの結果として、正しいものはどれか。