我們在 C 語言中經(jīng)常會遇到邏輯運(yùn)算符。|| 是從左向右開始計算的,當(dāng)遇到為真的條件時停止計算,整個表達(dá)式為真;所有條件為假時表達(dá)式才為假。 && 是從左向右開始計算,當(dāng)遇到為假的條件時停止計算,整個表達(dá)式為假;所有條件為真時表達(dá)式才為真。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名注冊、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、啟東網(wǎng)站維護(hù)、網(wǎng)站推廣。我們先來看個經(jīng)常會遇到的筆試題,以此代碼進(jìn)行分析
#includeint 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īng)常會認(rèn)為先執(zhí)行 && 運(yùn)算然后進(jìn)行 || 運(yùn)算。那么我們想著就是先執(zhí)行 ++j && ++k,執(zhí)行完之后 j 和 k 就分別為 1 了,那么整個表達(dá)式的值也就為真了。++i 就不執(zhí)行了,當(dāng)然 i 就為 0 了,下來我們來看看結(jié)果是否如此
結(jié)果剛好跟我們分析的相反。那么我們忽略了一個問題,那就是程序中的短路。在邏輯表達(dá)式中, && 比 || 具有更高的優(yōu)先級。在 && 和 || 混合運(yùn)算時,整個表達(dá)式被看做 || 表達(dá)式,編譯器從左向右開始計算 && 表達(dá)式,當(dāng)某個 && 表達(dá)式的值為真時,停止計算,整個表達(dá)式的值為真。那么我們的第9行可以這樣看:++i || ++j && ++k ==> ++i || (++j && ++k) ==> (true && ++i) || (++j && ++k)。那么這樣分析后,++i 就為 1 了,整個表達(dá)式的值就為真了。自然也就不會向后執(zhí)行了,所以結(jié)果應(yīng)該是1、0、0。
我們再來看一哥示例代碼,比較有迷惑性,代碼如下
#includeint g = 0; int f() { printf("In f()...\n"); return g++; } int main() { if( g || f() && f() ) { printf("In if statement: %d\n", g); } printf("In main(): %d\n", g); return 0; }
我們來分析下這個代碼,第14行表達(dá)式便可以看成 (true && g) || (f() && f()),那么由于 g 為0,前面為假,繼續(xù)向后執(zhí)行。這是便調(diào)用到 f() 了,便會打印出 In f()... 這條語句,它在內(nèi)部返回的 g++,就是先返回 0 再進(jìn)行++操作。由于 f() 已經(jīng)返回 0 了,所以后面的 && 表達(dá)式為假,因而 main 函數(shù)中的 if 中的打印語句得不到執(zhí)行。但是由于上面已經(jīng) g++ 了,所以這時 g 的值就為 1 啦。我們來看看編譯結(jié)果
我們下來來看下這個運(yùn)算符"!"。C語言中的邏輯非 "!" 只認(rèn)得0,只知道見了0就返回1,其他就都為0。我們來看下示例代碼。
#includeint main() { printf("%d\n", !0); printf("%d\n", !1); printf("%d\n", !100); printf("%d\n", !-1000); return 0; }
由上面可知,第一個為1,其他全為0。編譯后結(jié)果如圖
結(jié)果也確實如此。我們今天學(xué)習(xí)了邏輯運(yùn)算符相關(guān)的知識,總結(jié)如下:1、程序中的邏輯表達(dá)式遵從短路規(guī)則;2、在 && 與 || 混合運(yùn)算時:整個表達(dá)式被看做 || 表達(dá)式;從左向右先計算 && 表達(dá)式;最后計算 || 表達(dá)式;3、邏輯非 "!" 運(yùn)算符只認(rèn)得 0 碰見 0 返回 1,否則則返回1。只有 0 才代表假,其余所有值均代表真。后面我們會繼續(xù)對 C 語言的學(xué)習(xí)。
歡迎大家一起來學(xué)習(xí) C 語言,可以加我QQ:243343083。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。