首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 基礎入門 (17) - 關係運算符與邏輯運算符深度解析

     編輯:C++ 入門

4.1.4 關係運算符

C++ 提供六種關係運算符:> (大於)、>= (大於等於)、< (小於)、<= (小於等於)、== (等於)、!= (不等於)。它們都是二元運算符,操作數可以是算術類型、指針或枚舉,運算結果為 bool 類型 (true 或 false)。

最佳實踐:區分 == 與 =

這是新手最易犯的錯誤:

  • == 是判斷相等的關係運算符,不改變操作數值。
  • = 是賦值運算符,將右值賦給左邊變量,表達式值為賦值後的值。

防禦性編程技巧:

  1. 初始化時直接賦值:int a = 1; 編譯器會檢測 int a == 1; 語法錯誤。
  2. 常量放左邊比較:if (1 == a)。若誤寫 1 = a,編譯器報錯「不能賦值給常量」。
  3. 開啟編譯器警告:GCC -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 << "不相等";

這樣在任何平台、任何編譯優化下都能得到一致結果。

4.1.5 邏輯運算符

三種邏輯運算符:! (邏輯非,一元)、&& (邏輯與,二元)、|| (邏輯或,二元)。操作數隱式轉為 bool,結果為 bool。

真值表

ab!aa && ba || b
00100
01101
10001
11011

短路求值機制

&& 和 || 具有短路特性:

  • 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。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved