C++ 提供六種關係運算符:> (大於)、>= (大於等於)、< (小於)、<= (小於等於)、== (等於)、!= (不等於)。它們都是二元運算符,操作數可以是算術類型、指針或枚舉,運算結果為 bool 類型 (true 或 false)。
== 與 =這是新手最易犯的錯誤:
== 是判斷相等的關係運算符,不改變操作數值。= 是賦值運算符,將右值賦給左邊變量,表達式值為賦值後的值。防禦性編程技巧:
int a = 1; 編譯器會檢測 int a == 1; 語法錯誤。if (1 == a)。若誤寫 1 = a,編譯器報錯「不能賦值給常量」。-Wall 會提示「建議在條件判斷中使用 ==」。切勿用 == 直接比較兩個浮點數是否相等!
原因:大多數十進制小數 (如 0.1) 在二進制浮點數中無法精確表示,存在微小誤差。運算過程中誤差累積,導致理論相等的值實際不等。例如:
float a = 0.1f;
if (a * 10 == 1.0f) // 可能輸出 "不等於"!
cout << "等於";
else
cout << "不等於";
正確做法:設定容差 ε
const float EPS = 1e-4f; // 根據精度需求調整
if (fabs(a * 10 - 1.0f) < EPS)
cout << "視為相等";
else
cout << "不相等";
這樣在任何平台、任何編譯優化下都能得到一致結果。
三種邏輯運算符:! (邏輯非,一元)、&& (邏輯與,二元)、|| (邏輯或,二元)。操作數隱式轉為 bool,結果為 bool。
| a | b | !a | a && b | a || b |
|---|---|---|---|---|
| 0 | 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 0 | 1 |
| 1 | 1 | 0 | 1 | 1 |
&& 和 || 具有短路特性:
expr1 && expr2:若 expr1 為 false,直接返回 false,不計算 expr2。expr1 || expr2:若 expr1 為 true,直接返回 true,不計算 expr2。場景:判斷指針 p 非空且其成員 age ≥ 18。
無短路寫法 (需兩層 if):
if (p != nullptr) {
if (p->age >= 18) { ... }
}
利用短路寫法 (單層 if):
if (p != nullptr && p->age >= 18) { ... }
若 p == nullptr,第一個條件為假,短路跳過第二個條件,避免空指針解引用崩潰。這是短路機制最核心的工程價值——安全守衛模式。
int chinese, math;
cin >> chinese >> math;
if (chinese >= 60 && math >= 60) { // 邏輯與:兩門及格
if (chinese >= 85 || math >= 85) // 邏輯或:任一優秀
cout << "優秀";
else
cout << "合格";
} else {
cout << "不合格";
}
bool,注意 == vs =,浮點數比較必用容差。!, &&, || 配合短路特性,能寫出簡潔安全的條件判斷。fabs(a-b) < EPS。