C語言中提供了三種邏輯運算符:
與運算符(&&)和或運算符(||)均為雙目運算符。具有左結合性。非運算符(!)為單目運算符,具有右結合性。邏輯運算符和其它運算符優先級的關系可表示如下:
“&&”和“||”低於關系運算符,“!”高於算術運算符。
按照運算符的優先順序可以得出:
邏輯運算的值也為“真”和“假”兩種,用“1”和“0 ”來表示。其求值規則如下:
1) 與運算(&&)
參與運算的兩個量都為真時,結果才為真,否則為假。例如:
5>0 && 4>2
由於5>0為真,4>2也為真,相與的結果也為真。
2) 或運算(||)
參與運算的兩個量只要有一個為真,結果就為真。 兩個量都為假時,結果為假。例如:
5>0||5>8
由於5>0為真,相或的結果也就為真。
3) 非運算(!)
參與運算量為真時,結果為假;參與運算量為假時,結果為真。例如:
!(5>0)
的結果為假。
雖然C編譯在給出邏輯運算值時,以“1”代表“真”,“0 ”代表“假”。但反過來在判斷一個量是為“真”還是為“假”時,以“0”代表“假”,以非“0”的數值作為“真”。例如:
由於5和3均為非“0”因此5&&3的值為“真”,即為1。
又如:
5||0的值為“真”,即為1。
邏輯表達式的一般形式為:
表達式 邏輯運算符 表達式
其中的表達式可以又是邏輯表達式,從而組成了嵌套的情形。例如:
(a&&b)&&c
根據邏輯運算符的左結合性,上式也可寫為:
a&&b&&c
邏輯表達式的值是式中各種邏輯運算的最後值,以“1”和“0”分別代表“真”和“假”。
【例5-2】
復制純文本新窗口
- #include <stdio.h>
- int main(void){
- char c='k';
- int i=1,j=2,k=3;
- float x=3e+5,y=0.85;
- printf( "%d,%d\n", !x*!y, !!!x );
- printf( "%d,%d\n", x||i&&j-3, i<j&&x<y );
- printf( "%d,%d\n", i==5&&c&&(j=8), x+y||i+j+k );
- return 0;
- }
#include <stdio.h> int main(void){ char c='k'; int i=1,j=2,k=3; float x=3e+5,y=0.85; printf( "%d,%d\n", !x*!y, !!!x ); printf( "%d,%d\n", x||i&&j-3, i<j&&x<y ); printf( "%d,%d\n", i==5&&c&&(j=8), x+y||i+j+k ); return 0; }
本例中!x和!y分別為0,!x*!y也為0,故其輸出值為0。由於x為非0,故!!!x的邏輯值為0。對x|| i && j-3式,先計算j-3的值為非0,再求i && j-3的邏輯值為1,故x||i&&j-3的邏輯值為 1。對i<j&&x<y式,由於i<j的值為1,而x<y為0故表達式的值為1,0相與,最後為0,對i==5&&c&&(j=8)式,由於i==5為假,即值為0,該表達式由兩個與運算組成,所以整個表達式的值為0。對於式x+ y||i+j+k由於x+y的值為非0,故整個或表達式的值為1。