前言:伍**最近在刷劍指offer的面試題21的時候給||邏輯運算子坑的慘慘滴,足足浪費了我好些時間,耽誤了我西行的腳步;所以今天索性在此做乙個小總結給自己警醒一哈;1
&&和 2
||這兩個邏輯運算子應該是做開發以來最常用的兩個運算子了,平常使用那是順手拈來,怎麼會有坑給人掉呢?可能也只能怪伍**水平不夠了,咱話不多說,開整!
首先我們從概念上重新梳理一下&&和||:當我們在表示式之間使用&&和||的時候,程式是從左到右執行這些表示式的,並且在這個過程中只要有足夠條件判斷最後結果是對是錯,程式則停止繼續執行整個表示式,直接去執行下乙個語句。看懂了嗎,光說不練假把式,直接整兩個例子:
// != 和 == 優先順序都比 = 高
// !=, == 等關係運算子優先順序比邏輯運算子高
// 所以此處我沒有加括號()
bool a =1!=
2&&1==
1&&2==
2;// a的初始化值為false
bool b =1==
1||1!=
2;// b的初始化值為true
從上面兩個例子我們知道,當初始化a的時候,第乙個表示式的結果就是false,後面的邏輯運算子又都是&&,所以我們已經知道了整個表示式的最後結果為false;所以後面兩個表示式都不會執行,程式直接執行下一條語句去了;
初始化b的時候,第乙個表示式的結果就是true,而且後面的邏輯運算子都是||,所以同上,最終的結果為true;所以後面乙個表示式也不會執行,程式直接跳過;
聽起來很簡單是吧,嗯我也是這麼覺得的,為啥說會給坑呢?那就看看:
// 掉坑題目的簡化版
bool test()
bool a = true;
a = a ||
test()
;
簡單吧,也簡單,就是一開始沒想到,因為在我刷題的時候test()是乙個必須要執行的函式,但是第乙個表示式是true,又因為邏輯運算子||,test()根本沒有執行, 所以最後出現了意想不到的結果,就掉坑了;
順便貼上解決辦法吧,總結一下:
// method 1
bool a = true, b =
test()
;a = a || b;
// method 2
bool a = true;
a =test()
|| b;
勿以惡小而為之 --《三國志·蜀志傳》
更新日誌
25/05/2020 updated version 1.0.0
邏輯運算子與,左右兩側表示式都為真時,結果為真,任意乙個為假,結果則為假 ↩︎
邏輯運算子或,左右兩側都為假時,結果為假,任意乙個為真,結果為真 ↩︎
c語言之邏輯運算子
老分不清乙個 號和倆的用法,今天專門拿出來整理整理 一 邏輯運算子 包括 1。邏輯與 2。邏輯或 3。邏輯非 邏輯運算子用於對包含關係運算子的表示式進行合併或取非 對於使用邏輯運算子的表示式,返回0表示 假 返回1表示 真 關於邏輯運算子的解釋 請注意 任何使用兩個字元做符號的運算子,兩字元之間不應...
C語言邏輯運算子 和
include include strcmp所在標頭檔案 int main void 輸入的賬號 char szinputpassword 32 輸入的密碼 獲取輸入的賬號 printf 請輸入賬號 scanf s s szinputaccount,32 獲取輸入的密碼 printf 請輸入密碼 s...
C語言邏輯運算子 和
和 是邏輯運算子,分別是邏輯與 和邏輯或 邏輯與 三種 當邏輯與左邊為false 假 則不再進行邏輯與右邊的判斷,結果為false 假 當邏輯與左邊為true 真 則進行右邊判斷,右邊為false 假 結果為false 假 當邏輯與左邊為true 真 則進行右邊判斷,右邊也為true 真 則結果為t...