在 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;
}
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