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編譯器)