« poprzedni punkt 

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);


« poprzedni punkt