C++關係運算子(超詳細)

2020-07-16 10:04:40
計算機擅長比較值以確定其中一個是否大於、小於或等於另一個。這些型別的操作很有價值,例如,它可以檢測銷售圖表、確定收益和損失、對比數位以確保其在可接受的範圍內以及驗證使用者給出的輸入等。

在 C++ 中比較數值資料時可以使用關係運算子。字元也可以使用這些操作符進行比較,因為在 C++ 中字元被認為是數位值。每個關係運算子確定兩個值之間是否存在特定的關係。

例如,大於運算子(>)確定某值是否大於另一個值,相等運算子(=)確定兩個值是否相等。表 1 列出了 C++ 所有的關係運算子。

表 1 關係運算子
關係運算子 含 義
> 大於
< 小於
>= 大於或等於
<= 小於或等於
== 等於
!= 不等於

所有關係運算子都是二進位制的,這意味著它們使用兩個運算元。以下是使用大於運算子的表示式的範例:

x > y

該表示式稱為關係表示式,它用於確定 x 是否大於 y。以下表示式可以確定 x 是否小於 y:

x < y

關係的值

那麼,在程式中如何使用關係表示式呢?請記住,所有表示式都有一個值。關係表示式是布林表示式,這意味著它們的值只能是真(true)或假(false)。如果 x 大於 y,則表示式 x>y 的值將為 true,表示式 x<y 的值則為 false。

== 運算子確定其左側的運算項是否等於右側的運算項。如果兩個運算項具有相同的值,則表示式的值為 true。假設 a 為 4,則以下表示式的值為 true:

a == 4

而以下表示式的值則為 false:

a == 2

注意,關係運算子中的等號運算子是兩個 = 符號在一起。不要將此運算子與賦值運算子混淆,後者只有一個 = 符號。== 運算子確定變數是否等於另一個值,而 = 運算子則是將運算子右側的值賦給左側的變數。

兩個關係運算子實際上測試了一對關係。>= 運算子確定其左側的運算項是否大於或等 於右側的運算項。例如,如果 a 為 4,b 為 6,c 為 4,則以下兩個表示式均為 true:

b >= a
a >= c

而以下表示式則為 false:

a >= 5

操作符 <= 確定其左側的運算項是否小於或等於右側的運算項。沿用上例,如果 a 是 4, b 是 6,c 是 4,則以下兩個表示式的值都是 true:

a <= c
b <= 10

並且以下表示式則為 false:

b <= a

最後一個關係運算子是 !=,這是不相等的運算子。它確定其左側的運算項是否不同於(即不等於)右側的運算項,它與 == 操作符相反。如前所述,如果 a 為 4,b 為 6,c 為 4,則以下兩個表示式均為 true:

a != b
b != c

這些表示式的值是 true,因為 a 不等於 b,b 不等於 c。但是,以下表示式為 false,因為 a 等於 c:

a != c

表 2 顯示了其他關係表示式及其 true 或 false 值。

表 2 關係表示式範例(假設 x 為 10,y 為 7)
表示式
x < y false,因為 x 不小於 y
x > y true,因為 x 大於 y
x >= y true,因為 x 大於或等於 y
x <=y  false,因為 x 不小於或等於 y
y != x true,因為 y 不等於 x

真值和假值

如果關係表示式可以評估為 true 或 false,那麼這些值在程式內部是如何表示的?計算機如何在記憶體中儲存真值(true)?又如何儲存假值(false)?

在 C++ 中,這兩個抽象狀態被轉換為數位,即零被認為是 false,而任何非零的值都被認為是 true。C++ 關鍵字 false 被儲存為 0,關鍵字 true 被儲存為 1。當關係表示式為 false 時,它將被評估為 0。但是,當關係表示式為 true 時,並不總是被評估為 1。雖然它一般會被評估為 1,但是實際上它可以被評估為任何非零值。

為了更充分地說明,看一個程式:
// This program displays the values C++ uses to represent true and false.
#include <iostream>
using namespace std;

int main()
{
    bool trueValue, falseValue;
    int x=5, y = 10;
    trueValue = (x < y);
    falseValue = (y == x);
    cout << "True is " << trueValue << endl;
    cout << "False is " << falseValue << endl;
    return 0;
}
程式輸出結果:

True is 1
False is 0

來仔細研究一下程式中包含關係表示式的語句:

trueValue = (x < y);
falseValue = (y == x);

這些語句可能看起來很奇怪,因為它們將比較之後的結果值賦給變數。在第一個語句中,變數 trueValue 被賦值為 x <y 的比較結果。因為 x 小於 y,表示式為 true,於是變數 trueValue 被賦給一個非零值。而在第二個語句中,表示式 y = x 為 false,因此變數 falseValue 被設定為 0 值。

在編寫這些語句時,大多數程式設計師將關係表示式括在括號中,如上所示,以使之更清晰。當然,實際上並不需要括號,因為即使沒有它們,在執行賦值操作之前也將先執行關係操作。這是因為關係運算子的優先順序高於賦值運算子。同樣,算術運算子的優先順序高於關係運算子。

例如,以下語句:

result = x < y - 8;

相當於語句:

result = x < (y - 8);

在這兩種情況下,都是首先評估 y-8,然後將結果值與 x 進行比較。不過請注意,第二個語句要更清楚一些。當需要在關係表示式中使用一個算術表示式時,那麼使用括號將後者括起來總是一個好王意。

表 3 顯示了包含關係表示式的其他語句範例。

表 3 包含關係表示式的語句(假設 x 為 10,y 為 7,z 是 int 或 bool 變數)
語 句 結 果
z = x <y z 被賦值為 0,因為 x 不小於 y
cout<< (x > y); 顯示 1,因為 x 大於 y
z = (x >= y); z 被賦值為 1,因為 x 大於或等於 y
cout<<(x <= y); 顯示 0,因為 x 不小於或等於 y
z = (y != x); z 被賦值為 1,因為 y 不等於 x
cout<< (x = (y + 3)); 顯示 1,因為 x 等於 y + 3

關係運算子之間也有優先順序。測試相等或不相等的兩個運算子(== 和 !=)具有相同的優先順序。測試相對大小的其他 4 個關係運算子具有相同的優先順序。這 4 個相對關係運算子的優先順序高於兩個相等或不相等關係運算子。

換句話說,>、>=、<、<= 的優先順序大於 == 和 != 的優先順序。

以下是一個應用範例,如果 a = 9,6 = 24 和 c = 0,則以下語句顯示 1:

cout << (c == a > b);

由於此表示式中運算子的相對優先順序,首先計算 a>b。由於 9 不大於 24,所以評估為 false 或 0,然後評估 c = 0。因為 c 確實等於 0,所以這個計算結果為 true 或 1。將 1 插入到輸出流中並進行列印。