6. Operator warunkowy ?:
Operator warunkowy ?: ma trzy argumenty - wyrażenia i stosowany jest do konstrukcji wyrażenia warunkowego w następujący sposób:
e1 ? e2 : e3
Typ wyrażenia e1 musi być boolean. Typy pozostałych wyrażeń (e2 i
e3) muszą być takie same lub dopuszczające przekształcenie do tego samego
typu.
Zastosowania operatora ?: tworzy wyrażenie warunkowe.
Wyrażenie warunkowe obliczane jest w następujący sposób. Obliczane jest wyrażenie e1. Jeśli jego wartością jest true
to obliczane jest wyrażenie e2 i jego wartość staje się wartością całego
wyrażenia warunkowego, natomiast wyrażenie e3 jest ignorowane. W przeciwnym
razie ignorowane jest wyrażenie e2, a wartością wyrażenia warunkowgo staje
się - po obliczeniu - wartość wyrażenia e3.
Priorytet operatora ?: jest niski (wyższy tylko od priorytetów operatorów
przypisań i połączenia), wiązanie zaś - prawostronne. Niski priorytet operatora
warunku pozwala unikać nawiasów, choć często warto je zastosować dla większej
czytelności programu.
Wyrażenia warunkowe mogą zastępować proste instrukcje if .. else np.
W kontekście:
int a = 1,d;
float b = 0.7, c;
.....
int func1() {...}
int func2(int) { ...}
void func4() { ... }
| Instrukcja if |
Odpowiednik - wyrażenie
warunkowe
| if (a > b) c = a + 2;
else c = b; | c = a > b ? a + 2 : b; | if (a < b) c = a + 2;
else d = b + 2; | a < b ? c = a + 2 : d = b + 2; | if (b>0) d= func2(a) + 2;
else b *= 3.3; | b > 0 ? d = func2(a) + 2 : b *=
3.3; | if (b > 0) d = func1();
else a++; | b > 0 ? d = func1() : a++; | if (b > 0) func4();
else d = a + 7; | Nie da się tego zapisać w
postaci wyrażenia warunkowego.
gdyż operand e2 miałby typ void,
a operand e3 int. |
Jak widać zastępowanie instrukcji if operatorem warunkowym nie zawsze jest możliwe.
Jednak nie na zastępowaniu instrukcji if polega wartość operatora warunkowego.
Podstawową jego zaletą jest to, że może on być stosowany w wyrażeniach i
w takich sytuacjach, w których if nie może być zastosowane, lub jego zastosowanie
wymaga - w sumie - trochę sztucznych zabiegów.
Dotyczy to np. inicjacji zmiennnych np.:
int x = (a > b ? 1 : 0);
|