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