1、邏輯運算符 || &&
如果運算符左邊的子表達式決定了最終的結果,則右邊的子表達式不會計算
例如:
if(d != 0 && n/d > 0) {
/* average is greater than 0 */
}
if(p == NULL || *p == '\0') {
/* no string */
}
在第一個例子中,如果沒有短路行為,一旦d=0,則右邊的表達式會被0除--系統可能會崩潰;第二個例子中,如果p是空指針,則右邊的表達式引用一個空地址,從而可能導致系統崩潰。
2、C語言實參求值順序
C標准對實參的求值順序並沒有統一規定,但是多數系統對函數參數的求值順序是自右向左。
i = 3; printf("%d, %d\n", i, i++);
輸出結果是:4,3
3、i++ 與 ++i運算符
i = 3; j = (++i)+(++i)+(++i);
printf("j = %d, i = %d\n", j, i);
輸出結果為:j = 16, i = 6(gcc編譯器)
不同編譯器,結果可能不一樣。計算機在計算j = (a+b)+(c+d)+(e+f)時,先計算(a+b)+(c+d),並把結果存儲(例如:存儲在j中),然後再計算j+(e+f)=j;計算機中只有一個i,計算第二個i時,第一個i已改變。
int i = 1, j = 1, k;
i = (i++) + (++i);
k = (j++) + (++j);
printf("i = %d,j=%d, k=%d \n", i, j, k);
輸出結果為:i = 5, j = 3, k = 4(gcc編譯器)