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

Jinku Hu 2023年1月30日 2021年6月28日
  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 <string>
#include <iostream>

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

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 <string>
#include <iostream>

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

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 <string>
#include <iostream>

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;
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Operator