C言語の基礎
unsigned int reg = 0x04;
if (reg & 0x04 == 0x04)
printf("ON\n");
else
printf("OFF\n");レジスタの値 reg のビット2が1かどうかを調べるつもりで、上のコードを書いた。実行したときの結果として、正しいものはどれか。
- AONと表示される
- BOFFと表示される
- 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 では警告が出ます。