4.1 關(guān)系運算
4.1 關(guān)系運算
關(guān)系運算就是比較運算,即將兩個數(shù)據(jù)進行比較,判斷是否滿足給定的條件。如果滿足給定的條件,則稱關(guān)系運算的結(jié)果為邏輯值“真”;如果不滿足給定的條件,則稱關(guān)系運算的結(jié)果為邏輯值“假”。
例如,x>0是比較運算,也就是關(guān)系運算,“>”是一種關(guān)系運算符。如果x的值為1,那么x>0條件滿足,就是說關(guān)系運算x>0的結(jié)果為“真”。如果x的值為-1,那么x>0條件不滿足,就是說關(guān)系運算x>0的結(jié)果為“假”。
4.1.1 關(guān)系運算符
在C語言中有6種雙目關(guān)系運算符,見表4.1。
表4.1 關(guān)系運算符
① 關(guān)系運算符的優(yōu)先級前4種(<,<=,>,>=)相同,后兩種(==,!=)相同,且前4種的優(yōu)先級高于后兩種;
② 關(guān)系運算符的優(yōu)先級低于算術(shù)運算符,高于賦值運算符。
例如:
c>a+b 等價于 c>(a+b)
a==b<c 等價于 a==(b<c)
a=b>c 等價于 a=(b>c)
4.1.2 關(guān)系表達(dá)式
用關(guān)系運算符將兩個常量、變量或任意有效的表達(dá)式(如算術(shù)表達(dá)式、賦值表達(dá)式、關(guān)系表達(dá)式等)連接起來所構(gòu)成的符合C語言規(guī)則的式子,稱為關(guān)系表達(dá)式。關(guān)系表達(dá)式的一般形式為:
表達(dá)式 關(guān)系運算符 表達(dá)式
例如,以下都是合法的關(guān)系表達(dá)式:
a+b>c-d
(x=1)= =3/2
'a'+1<c
a>(b>c)
a!=(c= =d)
關(guān)系表達(dá)式的值是一個邏輯值,即“真”或“假”。C 語言沒有提供邏輯型數(shù)據(jù),它以數(shù)字1代表邏輯“真”,以數(shù)字0代表邏輯“假”,所以關(guān)系表達(dá)式的值只能是1或0兩種值。
例如:5>0的值為“真”,即該關(guān)系表達(dá)式的值為1,而(a=3)>(b=5)的值為“假”,即該關(guān)系表達(dá)式的值為0。
【例4.1】 關(guān)系運算符示例。
/* 關(guān)系運算符示例 */
#include "stdio.h"
main( )
{
char c='b';
int i=1,j=2,k=3;
printf("%d,",'a'+1<c);
printf("%d,",1<j<5);
printf("%d\n",k==j==i+5);
}
程序運行結(jié)果為:
0,1,0
在進行關(guān)系運算時應(yīng)注意以下事項。
① 應(yīng)避免對實數(shù)做相等或不等的判斷。
例如,關(guān)系表達(dá)式:1.0/3.0*3.0==1.0的值為0(假)。因為通常存放在內(nèi)存中的實型數(shù)是有誤差的,因此不可能精確相等或不等。
可將上式改寫為:fabs(1.0/3.0*3.0-1.0)<1e-6。其中,fbas( )是求絕對值的標(biāo)準(zhǔn)函數(shù),如果兩個實型數(shù)之間相差一個很小的正數(shù),就可以認(rèn)為兩者是相等的。
② 注意區(qū)分賦值運算符"="與關(guān)系運算符"=="兩種運算符的寫法和它們的含義。
③ 對于形如“10<=x<=20”的關(guān)系表達(dá)式,從語法上來說,C語言是允許的,但是在程序設(shè)計時它并不能正確地表示用戶的意圖。比如,當(dāng)用戶希望 x 的值在[10,20]范圍內(nèi)時,表達(dá)式值為1,否則值為0,那么當(dāng)x=1時,按照運算符的運算規(guī)則,先計算10<=x,因為x為1,所以結(jié)果為0,再計算0<=20,結(jié)果為1,顯然結(jié)果不對。其實無論x的值為多少,按照C語言的運算規(guī)則,表達(dá)式“10<=x<=20”的值都是1。