C之邏輯運算符(十四)
我們先來看個經常會遇到的筆試題,以此代碼進行分析
#include <stdio.h> int main() { int i = 0; int j = 0; int k = 0; ++i || ++j && ++k; printf("i = %d\n", i); printf("j = %d\n", j); printf("k = %d\n", k); return 0; }
那麽在第 9 行,我們經常會認為先執行 && 運算然後進行 || 運算。那麽我們想著就是先執行 ++j && ++k,執行完之後 j 和 k 就分別為 1 了,那麽整個表達式的值也就為真了。++i 就不執行了,當然 i 就為 0 了,下來我們來看看結果是否如此
結果剛好跟我們分析的相反。那麽我們忽略了一個問題,那就是程序中的短路。在邏輯表達式中, && 比 || 具有更高的優先級。在 && 和 || 混合運算時,整個表達式被看做 || 表達式,編譯器從左向右開始計算 && 表達式,當某個 && 表達式的值為真時,停止計算,整個表達式的值為真。那麽我們的第9行可以這樣看:++i || ++j && ++k ==> ++i || (++j && ++k) ==> (true && ++i) || (++j && ++k)。那麽這樣分析後,++i 就為 1 了,整個表達式的值就為真了。自然也就不會向後執行了,所以結果應該是1、0、0。
我們下來來看下這個運算符"!"。C語言中的邏輯非 "!" 只認得0,只知道見了0就返回1,其他就都為0。我們來看下示例代碼。
#include <stdio.h> int main() { printf("%d\n", !0); printf("%d\n", !1); printf("%d\n", !100); printf("%d\n", !-1000); return 0; }
由上面可知,第一個為1,其他全為0。編譯後結果如圖
結果也確實如此。我們今天學習了邏輯運算符相關的知識,總結如下:1、程序中的邏輯表達式遵從短路規則;2、在 && 與 || 混合運算時:整個表達式被看做 || 表達式;從左向右先計算 && 表達式;最後計算 || 表達式;3、邏輯非 "!" 運算符只認得 0 碰見 0 返回 1,否則則返回1。只有 0 才代表假,其余所有值均代表真。後面我們會繼續對 C 語言的學習。
歡迎大家一起來學習 C 語言,可以加我QQ:243343083。
C之邏輯運算符(十四)