C語言基礎

unsigned int i;
for (i = 3; i >= 0; i--)
    printf("%u ", i);

unsigned int 為32位元。執行上方程式碼時的動作,下列何者正確?

  1. A顯示 3 2 1 0 後結束
  2. B顯示 3 2 1 後結束
  3. C顯示 3 2 1 0 後仍不結束,從4294967295開始一邊遞減一邊持續顯示
查看答案與解析

正確答案:C. 顯示 3 2 1 0 後仍不結束,從4294967295開始一邊遞減一邊持續顯示

i 是無號的,因此不會變成負值,條件 i >= 0 永遠為真。i 為0時執行 i--,會回到 2³² − 1 = 4294967295,迴圈不會結束,持續顯示4294967294、4294967293。若要倒數到0,可以使用 int,或改寫成 for (i = 4; i-- > 0; ) 這樣的寫法。gcc 加上 -Wextra 時,會發出這個比較永遠為真的警告。

  • A. i 為0時 i >= 0 也為真,因此迴圈不會在0結束。
  • B. i 為0時條件也為真,因此也會顯示0,並在之後繼續執行。
  • C. 正確。無號的 i 從0減1會變成4294967295,條件永遠為真。
練習這個領域 前往領域頁面

C語言基礎的其他題目

  1. 設定「char c = 200;」並以 printf 的 %d 顯示 c 的程式,以 x86-64 Linux 用的 gcc 編譯執行時顯示 −56,以 Arm Linux 用的 gcc 則顯示200。產生差異的理由為下列何者?
  2. 執行上方在 && 與 || 的右邊寫了 b++ 的程式碼時的輸出,下列何者正確?
  3. 執行上方含有沒有 break 之 case 的 switch 敘述時的輸出,下列何者正確?
  4. 執行上方程式時的輸出,下列何者正確?
  5. 連續呼叫上方的函式 f 三次時,第3次的回傳值為下列何者?