C語言基礎

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

為了檢查暫存器值 reg 的位元2是否為1,寫了上方的程式碼。執行時的結果,下列何者正確?

  1. A顯示ON
  2. B顯示OFF
  3. 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 會發出警告。
練習這個領域 前往領域頁面

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位元。執行上方程式碼時的結果,下列何者正確?