条件演算子: ?:
構文
expression ? expression : expression
解説
条件演算子 (? :) は三項演算子です (3 つのオペランドを受け取ります)。 条件演算子は次のように機能します。
最初のオペランドは
bool
に暗黙的に変換されます。 これが評価され、すべての副作用が完了してから続行されます。最初のオペランドが
true
(1) と評価された場合、2 番目のオペランドが評価されます。最初のオペランドが
false
(0) と評価された場合、3 番目のオペランドが評価されます。
条件演算子の結果は、2 番目と 3 番目のどちらかのオペランドの評価の結果です。 条件式では、最後の 2 つのオペランドのうちの 1 つだけが評価されます。
条件式の結合規則は、右から左方向です。 最初のオペランドは整数またはポインター型である必要があります。 次の規則は、2 番目と 3 番目のオペランドに適用されます。
両方のオペランドが同じ型である場合、結果もその型になります。
両方のオペランドが演算型または列挙型である場合、通常の算術変換 (「標準変換」を参照) が実行されてそれらが共通型に変換されます。
両方のオペランドがポインター型である場合、または一方がポインター型でもう一方が 0 に評価される定数式である場合、それらを共通型に変換するためにポインター変換が実行されます。
両方のオペランドが参照型である場合、参照変換が実行されてそれらは共通型に変換されます。
両方のオペランドが void 型の場合は、共通型が void 型になります。
両方のオペランドが同じユーザー定義型である場合、共通型はその型になります。
オペランドの型が異なり、少なくとも 1 つのオペランドがユーザー定義型である場合、共通型を特定するために言語規則が使用されます (下記の警告を参照)。
上記のリストにない 2 番目と 3 番目のオペランドの組み合わせは無効です。 2 番目と 3 番目のオペランドが同じ型で両方が左辺値の場合は、結果の型は共通型であり、左辺値です。
警告
2 番目と 3 番目のオペランドの型が同一でない場合は、C++ 標準で指定されている複合型の変換規則が呼び出されます。 これらの変換は、一時オブジェクトの構築と破棄など、予期しない動作をする可能性があります。 このため、次のいずれかを行うことを強くお勧めします。(1) 条件演算子のオペランドとしてユーザー定義型を使用することは避ける。(2) どうしてもユーザー定義型を使用する場合は、各オペランドを一般的な型に明示的にキャストする。
例
// expre_Expressions_with_the_Conditional_Operator.cpp
// compile with: /EHsc
// Demonstrate conditional operator
#include <iostream>
using namespace std;
int main() {
int i = 1, j = 2;
cout << ( i > j ? i : j ) << " is greater." << endl;
}
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示