Operator warunkowy: ?:

Składnia

expression ? expression : expression

Uwagi

Operator warunkowy (? :) jest operatoremternary (przyjmuje trzy operandy). Operator warunkowy działa w następujący sposób:

  • Pierwszy operand jest niejawnie konwertowany na bool. Zostaje oceniony i przed kontynuowaniem ukończone zostają wszystkie efekty uboczne.

  • Jeśli pierwszy operand oblicza true wartość (1), drugi operand jest obliczany.

  • Jeśli pierwszy operand daje wartość false (0), zostanie obliczony trzeci operand.

Wynik operatora warunkowego jest wynikiem w zależności od ocenianego operandu — drugiego lub trzeciego. Tylko jeden z ostatnich dwóch operandów jest oceniany w wyrażeniu warunkowym.

Wyrażenia warunkowe mają zespolenie od prawej do lewej. Pierwszy operand musi być typu całkowitego lub typu wskaźnika. Następujące reguły dotyczą drugich i trzecich operandów:

  • Jeśli oba operandy są tego samego typu, wynik jest tego typu.

  • Jeśli oba operandy mają typy arytmetyczne lub wyliczenia, zwykle konwersje arytmetyczne (objęte konwersjami standardowymi) są wykonywane w celu przekonwertowania ich na typ wspólny.

  • Jeśli oba operandy mają typy wskaźników lub jeśli jeden jest typem wskaźnika, a drugi jest wyrażeniem stałym, które daje wartość 0, konwersje wskaźników są wykonywane w celu przekonwertowania ich na typ wspólny.

  • Jeśli oba operandy są typami referencyjnymi, konwersje odwołań są wykonywane w celu przekonwertowania ich na typ wspólny.

  • Jeśli oba operandy mają typ void, typ wspólny to void.

  • Jeśli oba operandy są tego samego typu zdefiniowanego przez użytkownika, typ wspólny to ten typ.

  • Jeśli operandy mają różne typy, a co najmniej jeden z operandów ma typ zdefiniowany przez użytkownika, reguły języka są używane do określania wspólnego typu. (Zobacz ostrzeżenie poniżej).

Dowolna kombinacja drugiego i trzeciego operandu nie wymieniona na powyższej liście nie jest dozwolona. Typ wyniku jest popularnym typem i l-wartością, jeśli zarówno drugi jak i trzeci operand są tego samego typu i oba są l-wartościami.

Ostrzeżenie

Jeśli typy drugich i trzecich operandów nie są identyczne, wywoływane są złożone reguły konwersji typów, jak określono w standardzie C++. Konwersje te mogą prowadzić do nieoczekiwanego zachowania, w tym budowy i zniszczenia obiektów tymczasowych. Z tego powodu zdecydowanie zalecamy (1) unikanie używania typów zdefiniowanych przez użytkownika jako operandów z operatorem warunkowym lub (2), jeśli używasz typów zdefiniowanych przez użytkownika, a następnie jawnie rzutowania każdego operandu na wspólny typ.

Przykład

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

Zobacz też

Wbudowane operatory, pierwszeństwo i kojarzenie języka C++
Operator wyrażenia warunkowego