Summary
1)&&表示式從左向右計算
,當遇到條件為假時,整個表示式為假,後面的表示式都不再執行,是為短路規則
;
2) ||表示式從左向右計算
,當遇到條件為真時,整個表示式為真,後面的表示式都不再執行,是為短路規則
;
3)邏輯表示式中&&比||的優先順序更高,表現為:當&&和||在同一個表示式中出現時,整個表示式被看作一個||表示式
。先計算&&表示式,最後計算整個的||表示式,某個表示式為真的時候,整個||表示式就短路了。
4)C語言中的邏輯非"!"
只認識0(假)
,其他的任何值都是非0(真)
。
"!"常用於if語句
中判斷表示式是否為假;也可用於將一個整數變為1,如!!100;
邏輯運算子的隱蔽知識點
1、&& 和 || 中的短路規則
||
從左向右
開始計算:當遇到條件為真時停止計算,整個表示式為真;所有條件都為假時表示式才為假int LogicFunc(int i) { printf("LogicFunc(int i) : %d\n", i); return i; } int main() { if(LogicFunc(1) || LogicFunc(0)) { printf("Logic expression is true"); } else { printf("Logic expression is false"); } } 輸出: LogicFunc(int i) : 1 Logic expression is true 原因:邏輯||表示式的短路規則,第1個表示式LogicFunc(1)返回1,為true,第二個表示式由於短路規則並未執行
&&
從左向右
開始計算:當遇到條件為假時停止計算,整個表示式為假;所有條件都為真時表示式才為真int LogicFunc(int i) { printf("LogicFunc(int i) : %d\n", i); return i; } int main() { if(LogicFunc(0) && LogicFunc(1)) { printf("Logic expression is true"); } else { printf("Logic expression is false"); } } 輸出: LogicFunc(int i) : 0 Logic expression is false 原因:邏輯&&表示式的短路規則,第1個表示式LogicFunc(0)返回0,false,第二個表示式由於短路規則並未執行
2、&& 和 || 混合運算時的規則
邏輯表示式中&&比||的優先順序更高,表現為:當&&和||在同一個表示式中出現時,整個表示式被看作一個||表示式
。先計算&&,最後計算||。
程式碼閱讀
// 以下程式碼的輸出是? int i = 0; int j = 0; int k = 0; int t = ++i || ++j && ++k; printf("t = %d\n", t); printf("i = %d\n", i); printf("j = %d\n", j); printf("k = %d\n", k);
程式碼分析
輸出: t = 1 i = 1 j = 0 k = 0 分析: ++i || ++j && ++k; ==> 等價於一個邏輯或表示式 (1 && ++i) || (++j && ++k); 左邊的邏輯與表示,1為真,繼續計算++i,i自增1,然後取值,所以左側表示式也為真 這時候遇到了邏輯或表示式的短路規則:左側表示式已經為真,右側的表示式不再計算。 因此,j和k仍然為0
3、"!"究竟是神馬
C語言中的邏輯非運算子只認得0,碰見0就返回1;否則就返回0;
printf("%d\n", !0); // 1
printf("%d\n", !-1); // 0
printf("%d\n", !100); // 0
printf("%d\n", !!100); // 1
本文總結自“狄泰軟體學院”唐佐林老師《C語言進階課程》。
如有錯漏之處,懇請指正。