int main() {
int i = 1, j = 1, k = 2;
if ((j++ || k++) && i++)
printf("%d,%d,%d\n", i, j, k);
return 0;
}
2,2,2j 當前值 1 (真),表達式值為 1。短路求值:|| 左操作數為真,**不再計算右操作數 k++**。j 遞增為 2,k 保持 2。i++。i 當前值 1 (真),表達式值為 1。i 遞增為 2。printf。i=2, j=2, k=2。| 運算符 | 短路規則 | 副作用執行時機 |
|---|---|---|
|| | 左真則短路(右不算) | 左操作數求值後立即執行副作用 |
&& | 左假則短路 | 左操作數求值後立即執行副作用 |
? : | 條件真只算第2項,假只算第3項 | 選中項求值時執行 |
, | 不短路,左到右順序求值 | 各子表達式求值後執行 |
如果在函數中的復合語句中定義了一個變量,則該變量只在該復合語句中有效對麼?
是的。C 語言採用塊作用域:{ ... } 內聲明的變量,作用域從聲明處開始到塊結束。例如:
void foo() {
int a = 1;
{ int a = 2; printf("%d\n", a); } // 輸出 2,內層 a 遮蔽外層
printf("%d\n", a); // 輸出 1
}
C99 允許在塊中任意位置聲明變量(不必在塊開頭)。
&& || ? : , 有序列點保證順序,但其他運算符無序列點)。