&& 運算符
&& 運算符被稱為邏輯與運算符。它需要兩個表達式作為操作數,並創建一個表達式,只有當兩個子表達式都為 true 時,該表達式才為 true。
以下是使用 && 運算符的 if 語句示例:
if ((temperature <20) && (minutes > 12))
cout << "The temperature is in the danger zone.";
請注意,這兩個被邏輯與運算符連接在一起的表達式都是完整的表達式,它們的值可以被評估為 true 或 false。首先評估 temperature<20
以產生 true 或 false 的結果,然后評估 minutes>12
以產生 true 或 false 的結果,最后,這兩個結果被 AND 並列在一起,以得出整個表達式的最終結果。
僅當 temperature 小於 20 且 minutes 大於 12 時,cout 語句才會執行,其中只要有一個表達式的結果被評估為 false,則整個表達式為 false,不執行 cout 語句。
表 2 顯示了 && 運算符的真值表。該真值表列出了兩個表達式可能的值及其所有可能的組合,以及由連接兩個表達式的 && 操作返回的結果值。
子表達式值所有可能的組合 | 整體表達式的值 |
---|---|
false && false | false(0) |
false && true | false(0) |
true && false | false(0) |
true && true | true(1) |
如該表所示,要使 && 運算符返回 true 值,則兩個子表達式都必須為 true。
注意,如果 && 運算符左側的子表達式為 false,則不會檢查右側的表達式。因為只要有一個子表達式為 false,則整個表達式都為 false,所以再檢查剩余的表達式會浪費 CPU 時間。這被稱為短路評估。
|| 運算符
|| 運算符被稱為邏輯或運算符。它需要兩個表達式作為操作數,並創建一個表達式,當任何一個子表達式為 true 時,該表達式為 true。
以下是一個使用 || 運算符的 if 語句示例:
if ((temperature < 20) || (temperature > 100))
cout << "The temperature is in the danger zone.";
如果 temperature 小於 20 或者大於 100,那么 cout 語句將被執行。這兩個子表達式只要其中一個為 true,則整個表達式為 true,執行 cout 語句。
注意,被邏輯或連接在一起的兩件事情應該都是邏輯表達式,它們的值為 true 或 false,按以下形式書寫的if條件是不正確的:
if (temperature <20 || >100)
表 3 顯示了或(||)運算符的真值表。
子表達式值所有可能的組合 | 整體表達式的值 |
---|---|
false || false | false(0) |
false || true | true(1) |
true || false | true(1) |
true || true | true(1) |
只要其中一個子表達式為 true,則整體表達式為 true,此時另外一個子表達式無論是 false 還是 true 都無關緊要。
需要注意的是,|| 運算符也將進行短路評估。如果 || 運算符左側的子表達式為 true,則右側的子表達式將不被檢查,因為只要有一個子表達式為 true,那么整體表達式就可以被評估為 true。
! 運算符
! 運算符被稱為邏輯非運算符,執行邏輯 NOT 操作。它可以反轉一個操作數的真值或假值。換句話說,如果表達式為 true,那么 ! 運算符將返回 false,如果表達式為 false,則返回 true。
以下是一個使用 ! 運算符的 if 語句示例:
if (!(temperature > 100))
cout << "You are below the maximum temperature. \n";
首先,表達式 (temperature > 100)
將被測試為 true 或 false,然后!運算符被應用於該值。如果表達式 (temperature>100)
為 true,則!運算符返回 false。如果為 false,則!運算符返回 true。在該例子中,它相當於問“溫度是不是不大於 100?”或“溫度大於 100 是不是假的?”
表 4 顯示了非(!)運算符的真值表。
表達式 | 表達式的值 |
---|---|
! false | true(1) |
! true | false(0) |
布爾變量和!運算符
布爾變量的一個有趣特性是它的值可以簡單地通過命名來測試。假設 moreData 是一個布爾變量,其測試語句如下:
if (moreData == true)
它可以簡寫為:
if (moreData)
再來看以下語句:
if (moreData == false)
它可以使用邏輯非運算符簡寫為:
if (! moreData)
&&、|| 和 ! 的優先級
&&、|| 和 !的優先級為:
! > && > ||
! 運算符比許多 C++ 運算符具有更高的優先級。因此,為了避免錯誤,應始終將其操作數括在括號中,除非打算將其應用於沒有其他操作符的變量或簡單表達式。例如,來看以下表達式:
! (x > 2)
! x > 2
第一個表達式將 !運算符應用於表達式 x>2,它是在問“x 是否不大於 2”,然而,第二個表達式是將 !運算符應用於到 x。它是在問“x 的邏輯是否大於 2”。假設 x 被設置為 5,由於 5 是非零值,所以被認為是 true,而 !運算符會將其反轉為 false,即為 0,然后,> 運算符將確定 0 是否大於 2。為了避免這種錯誤,始終使用括號是明智的。
&& 和 || 運算符的優先級低於關系運算符,這意味着關系表達式先進行計算,然后再通過 && 和 || 運算符進行評估,因此有:
a > b && x < y 等同於(a > b) && (x < y)
a > b || x < y 等同於(a > b) | | (x < y)
因此,在關系運算符與 && 和 || 混合時,通常不需要括號。當然,無論如何,使用括號都是一個好主意,因為它們可以讓程序更易讀。
在 && 和 || 同時使用的情況下,更是強烈地推薦使用括號,這是因為 && 的優先級高於 ||。如果沒有括號表示執行順序,那么 && 將永遠在 || 之前完成,這可能並不符合編寫者的初衷。
例如,假設有 3 個布爾變量 recentGrad、employed 和 goodCredit,則以下表達式:
recentGrad || employed && goodCredit
等同於以下表達式:
recentGrad || (employ && goodCredit)
但是它並不等同於以下表達式:
(recentGrad || employed)&& goodCredit
運算符 | 含義 | 效 果 |
---|---|---|
&& | 與 | 將兩個表達式連接成一個。兩個表達式必須都為 true,整個表達式才為 true |
|| | 或 | 將兩個表達式連接成一個。必須有一個或兩個表達式為 true,才能使整個表達式為 true。只要其中有一個為 true,那么另外一個就變得無關緊要 |
! | 非 | 反轉一個表達式的“真相”。它使一個表達式從 true 變成了 false,或者從 false 變成了 true |