C語言基礎
unsigned int reg = 0x04;
if (reg & 0x04 == 0x04)
printf("ON\n");
else
printf("OFF\n");為了檢查暫存器值 reg 的位元2是否為1,寫了上方的程式碼。執行時的結果,下列何者正確?
- A顯示ON
- B顯示OFF
- C不能把 & 與 == 連著寫,因此發生編譯錯誤
查看答案與解析
正確答案:B. 顯示OFF
C語言中,比較運算的 == 優先順序高於位元AND的 &。因此條件被解讀為 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 會發出警告。