4.2 邏輯運算
關系運算處理的是簡單的比較運算,而邏輯運算則處理的是復雜的關系運算。例如,要求x大于等于10且小于等于20時,這樣的條件如果要正確表示就要用到邏輯運算。
4.2.1 邏輯運算符
在C語言中有3種邏輯運算符,見表4.2。
表4.2 邏輯運算符
(1)邏輯運算符的優先級
① 在3種邏輯運算符中,邏輯非“!”的優先級最高,邏輯與“&&”次之,邏輯或“||”最低。
② 邏輯運算符“&&”和“||”的優先級低于關系運算符,而“!”高于算術運算符。
例如:
a>b&&x>y 等價于 (a>b)&&(x>y)
!a+1||a>b 等價于 ((!a)+1)||(a>b)
(2)邏輯運算的規則
① 邏輯與“&&”:參與運算的兩個量都為真時,結果才為真,否則為假。例如,5>2 &&4>0,由于5>2為真,4>0為真,所以相與的結果也為真。
② 邏輯或“||”:參與運算的兩個量只要有一個為真,結果就為真。兩個量都為假時,結果為假。例如,5>0||5>6,由于5>0 為真,相或的結果也就為真。又如,5<2||5>6,由于5<2和5>6均為假,相或的結果也就為假。
③ 邏輯非“!”:參與的運算量為真時,結果為假;參與的運算量為假時,結果為真。例如,!(5<2),由于(5<2)為假,非的結果就為真。
邏輯運算的規則可用邏輯運算真值表表示,見表4.3。
表4.3 邏輯運算真值表1
邏輯運算的值有“真”和“假”兩種,C語言編譯系統在給出邏輯運算值時,以“1”代表真,“0”代表假。
判斷一個量為“真”還是“假”時,以數值0代表“假”,以非0的數值代表“真”。例如,由于5和2均為非0,因此邏輯運算5&&2的值為“真”,即為1。又如,由于!5為假,即0,所以邏輯運算!5||0的值為假,即0。
所以邏輯運算規則可以改為表4.4。
表4.4 邏輯運算真值表2
邏輯表達式是指用邏輯運算符將運算對象連接起來的符合C語言規則的式子。邏輯表達式的一般形式為:
[表達式] 邏輯運算符 表達式
例如:
x>10 && x<20
4&&0||(a=2)
'c' &&'d'
!a<b
注意:邏輯表達式的值只能是 0 或 1,不可能是其他數值,而在邏輯表達式中參與邏輯運算的運算對象卻可以是任意數據類型的數據(如字符型、實型、指針型等)。
【例4.2】 邏輯運算示例。
程序代碼如下:
/* 邏輯運算示例 */
#include "stdio.h"
main( )
{
char c='b';
int i=1,j=2,k=3;
printf("%d,",!i*!j);
printf("%d,",i<j&&'a'<c);
printf("%d\n",i==5&&c&&(j=8));
}
程序運行結果為:
0,1,0
需要強調的是,在邏輯表達式的求解中,并不是所有的邏輯運算符都被執行,只是在必須執行下一個(右側)邏輯運算符才能求出表達式的值時,才執行該運算符。例如,下列邏輯表達式:
a&&b&&c
在求其值時有以下4種情況:
● 只有a為真時,才需要判斷b的值;
● 只有a、b都為真時,才需要判斷c的值;
● 如果a為假,則此時整個表達式已經確定為假,就不必判斷b和c了;
● 如果a為真,b為假,則不必判斷c。
請思考,下列程序段執行后的輸出結果是什么?
int a=1,b=2,c=3,d=4,m=1,n=1;
printf(“%d,%d,%d\n”, (m=a>b)&&(n=c>d),m,n);
根據運算符的運算規則及優先級和結合性,由于“a>b”為假(0),則賦值表達式“m=a>b”的值為0,變量m的值也為0,此時整個表達式的結果已知(為0),不再進行表達式“n=c>d”的計算,所以n的值依然是1,并未改變。
又如下列邏輯表達式:
a||b||c
● 只要a為真,則整個表達式已經確定為真,就不必判斷b和c了;
● 如果a為假,b為真,則整個表達式已經確定為真,就不必判斷c了;
● 只有a、b都為假時才判斷c。
請思考,下列程序段執行后的輸出結果是什么?
int a=1,b=2,c=3,d=4,m=1,n=1;
printf(“%d,%d,%d\n”, (m=a>b)||(n=c>d),m,n);
根據運算符的運算規則及優先級和結合性,由于“a>b”為假(0),則賦值表達式“m=a>b”的值為0,變量m的值也為0,此時整個表達式的結果還不能確定,所以繼續進行運算符“||”右側表達式的計算,由于“c>d”為假(0),則賦值表達式“n=c>d”的值為 0,變量 n 的值也為0,此時整個表達式的結果已知(為0)。
掌握了 C 語言的關系運算符和邏輯運算符后,就可以表示一個復雜的條件了。例如,判斷某一年是否是閏年。判斷閏年的方法是看是否符合下面兩個條件之一:①能被4整除,但不能被100整除;②能被400整除。假設用標識符year表示某一年,則第一個條件可表示為:
year%4==0 && year%100!=0
第二個條件可表示為:
year%400==0
綜合起來,判斷閏年的條件可以用一個邏輯表達式表示:
(year%4==0&&year%100!=0) ||year%400==0
表達式為真,閏年條件成立,是閏年;否則不是閏年。