在 C++ 中使用條件運算子

Jinku Hu 2023年10月12日
  1. 在 C++ 中使用條件運算子作為 rvalue 表示式
  2. 在 C++ 中使用條件運算子作為 lvalue 表示式
在 C++ 中使用條件運算子

本文將解釋如何使用 C++ 條件運算子。

在 C++ 中使用條件運算子作為 rvalue 表示式

除了常見的算術、邏輯和賦值運算子之外,C++ 還提供了一些特殊的運算子,其中之一是條件三元運算子。三元意味著運算子采用三個運算元。它被稱為條件運算子,因為它的工作方式類似於 if-else 語句。運算子的形式為 E1 ? E2 : E3,其中第一個運算元可以被視為 if 條件,它被評估並轉換為 bool 值。

如果 bool 值為 true,則計算以下表示式 (E2),併產生副作用。否則,將評估第三個表示式 (E3) 及其副作用。請注意,我們可以使用此運算子作為 rvalue 表示式來有條件地為變數賦值。在下面的示例程式碼中,我們從使用者輸入中讀取一個整數並計算比較表示式 input > 10,表示條件運算子中的 E1 運算元。僅當 E1 為真時,變數 n 才被賦予 input 值。

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
  int input;

  cout << "Enter a single integer: ";
  cin >> input;
  int n = input > 10 ? input : 10;

  cout << "n = " << n << endl;

  return EXIT_SUCCESS;
}

輸出:

Enter a single integer: 21
n = 21

在 C++ 中使用條件運算子作為 lvalue 表示式

或者,我們可以使用三元運算子作為 lvalue 表示式來有條件地選擇進行賦值操作的變數名稱。請注意,我們僅將變數名稱指定為第二個和第三個運算元。但是,通常你可以指定諸如 cout 之類的表示式,它具有外部副作用;這些效應會像往常一樣被執行。

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
  int input;

  cout << "Enter a single integer: ";
  cin >> input;
  int n = input > 10 ? input : 10;

  cout << "n = " << n << endl;

  int m = 30;
  (n == m ? n : m) = (m * 10) + 2;

  cout << "m = " << m << endl;

  return EXIT_SUCCESS;
}

輸出:

Enter a single integer: 21
n = 21
m = 302

三元運算子的另一個用例可以在 class 定義中。下面的程式碼示例演示了這樣一個場景,我們為類似於單連結串列中的節點的 MyClass 結構實現了一個遞迴建構函式。在這種情況下,我們將建構函式呼叫指定為第二個運算元,使用 next 引數呼叫,並繼續遞迴呼叫堆疊,直到 node.next 評估為 false 值。後者僅適用於 node.next 指標為 nullptr 的情況。

#include <iostream>
#include <string>

struct MyClass {
  MyClass* next;
  int data;

  MyClass(const MyClass& node)
      : next(node.next ? new MyClass(*node.next) : nullptr), data(node.data) {}

  MyClass(int d) : next(nullptr), data(d) {}

  ~MyClass() { delete next; }
};

int main() { return EXIT_SUCCESS; }
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Operator