C語言基礎

int a = 0, b = 0;
if (a++ && b++) { }
if (a++ || b++) { }
printf("%d %d\n", a, b);

執行上方在 && 與 || 的右邊寫了 b++ 的程式碼時的輸出,下列何者正確?

  1. A2 0
  2. B2 1
  3. C2 2
查看答案與解析

正確答案:A. 2 0

&& 在左邊為偽時、|| 在左邊為真時,不會求值右邊(短路求值)。第1個 if 中,a++ 的值是遞增前的0而為偽,因此不執行 b++,只有 a 變成1。第2個 if 中,a++ 的值是1而為真,因此同樣不執行 b++,a 變成2。在右邊寫入 ++ 或函式呼叫等有副作用的運算式時,要注意它是否執行會隨左邊的值而改變。

  • A. 正確。兩個 if 中,右邊的 b++ 都沒有執行。
  • B. 這是認為其中一個 if 執行了一次 b++ 時的值。兩者都由左邊決定結果,因此不會求值。
  • C. 這是認為兩個 b++ 都執行時的值。兩者都由左邊決定結果,因此不會求值。
練習這個領域 前往領域頁面

C語言基礎的其他題目

  1. 執行上方含有沒有 break 之 case 的 switch 敘述時的輸出,下列何者正確?
  2. 執行上方程式時的輸出,下列何者正確?
  3. 連續呼叫上方的函式 f 三次時,第3次的回傳值為下列何者?
  4. C語言中,(1) 在函式中沒有加 static 宣告的區域變數、(2) 以 malloc 配置的區域、(3) 在函式外宣告的變數,各自存在的期間(生命週期)的組合,下列何者正確?
  5. int 為32位元(最大值 2147483647)。上方的函式 fact(n) 能不發生溢位、正確回傳 n 的階乘的最大 n 為下列何者?