Autor: Dondu
Kurs języka C: Spis treści
Operator warunkowy jest operatorem trójelementowym składającym się z warunku i dwóch wartości. Operator ten zwraca:
- wartość pierwszą, gdy warunek jest spełniony,
- wartość drugą, gdy warunek nie jest spełniony,
wynik = warunek ? wartosc1 : wartosc2 ;
Operator warunkowy odpowiada instrukcji :
if(warunek) wynik = wartosc1; //gdy warunek jest spełniony else wynik = wartosc2; //gdy warunek nie jest spełniony
lub zapisując inaczej:
if(warunek){ //gdy warunek jest spełniony wynik = wartosc1; }else{ //gdy warunek nie jest spełniony wynik = wartosc2; }
Jak widać powyżej, operator warunkowy pozwala w prostych przypadkach na zapisanie w jednej linii kodu działania zależnego od wyniku badania warunku.
Przykład 1 (w kompilatorze)
int wynik; int warunek=1; //symulujemy spełniony warunek wynik = warunek ? 100 : 200;
Sprawdź przykład w kompilatorze CManiak. Zobacz także, co się stanie gdy zmienisz wartość warunku na zero.
Dane mogą być definicją, stałą, zmienną lub wyrażeniem.
Przykład 2 (w kompilatorze)
#define ilosc 1000 const int c = 91; int a=8, b=9; wynik = warunek ? ilosc*a-c*b : b+c ;Przetestuj powyższy kod w kompilatorze CManiak.
W przeciwieństwie do instrukcji if( ) operator warunkowy ? nie może zawierać bezpośredniego wykonania instrukcji przypisania, czyli nie jest możliwe takie wykorzystanie operatora:
Przykład 3 (w kompilatorze)
warunek ? wynik=100 : wynik=200; //nieprawidłowe wykorzystanie operatora
Ale wystarczy zastosować nawiasy i już mamy możliwość wykorzystania operatora w taki sposób:
Przykład 4 (w kompilatorze)
warunek ? (wynik=100) : (wynik=200); //prawidłowe wykorzystanie operatora
Możliwe jest także wykorzystanie innych operatorów zmieniających stan zmiennych np. operatorów inkrementacji i dekrementacji. W tym wypadku nie trzeba stosować nawiasów.
Przykład 5 (w kompilatorze)
warunek ? ++wynik : --wynik;
Zauważ, że w przykładach 3, 4 i 5 nie wykorzystujemy wartości zwracanej przez operator warunkowy, a jedynie ustawiamy zmienne. Ale nic nie stoi na przeszkodzie, by wartość zwracaną wykorzystać:
Przykład 6 (w kompilatorze)
wynik = warunek ? (a=100) : (a=200);Wtedy oprócz ustawienia zmiennej a, ustawimy zarazem zmienną wynik. Sprawdź w kompilatorze jak to działa.
Można także wykorzystywać funkcje.
Przykład 7 (w kompilatorze)
wynik = warunek ? jakas_funkcja() : wartosc2; }
I znowu zapraszam do kompilatora CManiak, gdzie pobawisz się z tym przykładem oraz pozostałymi.
Kurs języka C: Spis treści
24
"W przeciwieństwie do instrukcji if( ) operator warunkowy ? nie może zawierać wykonania instrukcji przypisania, czyli nie jest możliwe takie wykorzystanie operatora".
OdpowiedzUsuńAby na pewno? Z tego co mi się wydaje (i kod w dostępnym tu kompilatorze potwierdził) wystarczy przypisanie wziąć w nawias i się kompiluje, jak powinno.
warunek ? (wynik=100) : (wynik=200);
Powodem takiego działania będzie fakt, że operator ?: ma ciut wyższy priorytet od wszelkiego typu przypisań (i dobrze, bo w przeciwnym wypadku nie działałby kod w stylu:
wynik = warunek ? 100 : 200;
(do wyniku byłaby przypisywana wartość warunku), tylko musiałby być zapisywany jako:
wynik = (warunek ? 100 : 200);
a tak, można nawias pominąć).
Tak masz rację, dodanie nawiasów umożliwia wykonanie operacji przypisania. Zaraz dopiszę ten przypadek - dziękuję za zwrócenie uwagi.
OdpowiedzUsuńchyba w przykładzie 5 w cmaniaku brakuje "wynik= warunek ?..."
OdpowiedzUsuńBył błąd, ale inny. Ten przykład pokazuje jak wykorzystać operator warunkowy znaku zapytania do operacji na zmiennych, a nie przypisywaniu wyniku. Przykład poprawiony zarówno w tekście artykułu jak i CManiaku. Dziękuję za zwrócenie uwagi!
UsuńPozdrawiam,
Jacek