||和|,&和&&是初學(xué)者容易混淆的運(yùn)算符。
從運(yùn)算符種類來看,兩者是完全不同的運(yùn)算符。
||是邏輯運(yùn)算符,表示邏輯或;
&&是邏輯運(yùn)算符,表示邏輯與;
|是位運(yùn)算符,表示按位或;
&是位運(yùn)算符,表示按位與。
邏輯運(yùn)算符的優(yōu)先級比位運(yùn)算符優(yōu)先級低。
按位或運(yùn)算符|表示將兩個(gè)整數(shù)用二進(jìn)制表示后,按位進(jìn)行操作,只要有1位出現(xiàn)1則當(dāng)前位的值為1,每一位運(yùn)算取值有以下4種情況。
0|0=0 0|1=1 1|0=1 1|1=1
按位與運(yùn)算符&表示將兩個(gè)整數(shù)用二進(jìn)制表示后,按位進(jìn)行操作,只要有1位出現(xiàn)0則當(dāng)前位的值為0,每一位運(yùn)算取值有以下4種情況。
0&0=0 0&1=0 1&0=0 1&1=1
邏輯運(yùn)算符則是對判斷真假,C語言中沒有布爾類型true和false,使用0表示假,使用非0的值表示真,邏輯與&&表示兩個(gè)條件同時(shí)為真,結(jié)果為真,有四種取值情況:
0(假) && 0(假) = 0(假)
0(假) && 非0值(真) = 0(假)
非0值(真) && 0(假) = 0(假)
非0值(真) && 非0值(真) = 1(真)
邏輯或||表示兩個(gè)條件只要有一個(gè)為真,結(jié)果為真,有四種取值情況:
0(假) || 0(假) = 0(假)
0(假) || 非0值(真) = 1(真)
非0值(真) || 0(假) = 1(真)
非0值(真) || 非0值(真) = 1(真)
C語言條件語句中,例如if判斷,while判斷,for循環(huán)條件判斷中,使用A||B或A|B,A&&B或A&B,雖然某些情況條件判斷的結(jié)果是一樣的,不影響程序執(zhí)行。但是,兩者區(qū)別很大,混淆使用容易出錯(cuò):
1.邏輯運(yùn)算符和位運(yùn)算符是兩種類型運(yùn)算符,優(yōu)先級不一樣,位運(yùn)算符優(yōu)先級高;
2.邏輯表達(dá)式和位運(yùn)算表達(dá)式具體的表達(dá)式值不一樣,混用將導(dǎo)致出錯(cuò),例如:
0 | 2 = 2 // 條件判斷為真,但是值卻不一樣
0 || 2 = 1 // 條件判斷為真,但是值卻不一樣
1 & 2 = 0 // 條件判斷為假
1 && 2 = 1 // 此時(shí)條件判斷為真
3.if,while,for等條件判斷,必須使用邏輯運(yùn)算符,因?yàn)檫壿嬤\(yùn)算符,顧名思義,本來就是用來邏輯判斷,符合語義,提高代碼可讀性,避免出錯(cuò)。
4.C語言沒有布爾邏輯類型true和false,使用非0表示真,0值表示假,導(dǎo)致了邏輯判斷無法類型檢查,任何表達(dá)式值都可以作為邏輯判斷,當(dāng)出現(xiàn)混用時(shí),無法提示,因此務(wù)必小心。
備注:C99標(biāo)準(zhǔn),通過標(biāo)準(zhǔn)庫<stdbool.h>提供布爾類型_Bool和簡化使用的宏bool,明確true用1表示,false用0表示,該類型只能取0和1兩種值。
其實(shí)做為一個(gè)學(xué)習(xí)者,有一個(gè)學(xué)習(xí)的氛圍跟一個(gè)交流圈子特別重要這里我推薦一個(gè)C/C++基礎(chǔ)交流583650410,不管你是小白還是轉(zhuǎn)行人士歡迎入駐,大家一起交流成長。

