11. Operator „?”
a
Operator ? jest bardzo użyteczną, lecz często nie docenianą konstrukcją. Jak zwykle jego zastosowanie pokażemy na przykładzie. Załózmy, że mamy do czynienia z dwoma zmiennymi a i b i chcielibyśmy wyświetlić na ekranie wartość większej z nich. Program przy użyciu znanej już instrukcji if wyglądałby tak:
#include <stdio.h>
void main(void)
{
int a = 5, b = 6, c;
if(a > b) c=a; else c=b;
printf(„Max(a,b) = %d
„, c);
}
Jak widzisz programik jest prościutki – gdy zmienna a jest większa od zmiennej b to przypisuje zmiennej c wartość zmiennej a, natomiast w przeciwnym wypadku przypisuje jej wartość zmiennej b. Następnie na ekranie wyświetla wartość zmiennej c.
Jednak teoria o tym, że programiści to leniwe bestie potwierdza się i tym razem 😉 Co z tego, że zapis jest prościutki, skoro można zrobić to jeszcze prościej ? Do tego celu służy właśnie operator ? . Nasz programik przy jego użyciu wyglądałby tak:
#include <stdio.h>
void main(void)
{
int a = 5, b = 6, c;
c = (a > b) ? a : b;
printf(„Max(a,b) = %d
„, c);
}
Jak widzisz instrukcja if została zamieniona na coś, co z początku może wydawać się strasznie dziwnym zapisem. Jednak nie przerażaj się – wcale nie jest to takie straszne. Zauważ, że mamy tu do czynienia z takim przypadkiem:
c = jakieś_wyrażenie; // gdzie wyrażenie to jest operatorem „?”
Ogólna konstrukcja tego operatora wygląda tak:
(wyrażenie_logiczne) ? wyrażenie_gdy_prawda : wyrażenie_gdy_fałsz
Najpierw sprawdzane jest wyrażenie logiczne w nawiasie, jeśli jest ono prawdziwe, to obliczana jest wartość wyrażenia znajdującego sie po znaku ? i jest ona zwracana, natomiast w przypadku, gdy wyrażenie logiczne było fałszywe to obliczana jest wartość wyrażenia znajdującego się po znaku : i właśnie ona jest zwracana. Czyli w naszym przykładowym programie najpierw sprawdzamy, czy zmienna a jest większa od zmiennej b. Ponieważ a jest równe pięć, natomiast b jest równe sześć to wyrażenie to jest fałszywe i obliczana jest wartość wyrażenia występującego po znaku : . W naszym przypadku jest tam po prostu zmienna b, ktorej wartość jest zwracana i przypisana do zmiennej c.
Zapewne powiesz: „No dobrze, ale ten zapis wcale nie jest dużo krótszy od poprzedniego, a poza tym jest o wiele mniej czytelny”. Masz rację, jednak cała siła operatora ? tkwi w tym, że można go używać praktycznie w każdej sytuacji. Przykładowo, nasz program można zapisać w ten sposób:
#include <stdio.h>
void main(void)
{
int a = 5, b = 6;
printf(„Max(a,b) = %d
„, (a>b) ? a : b);
}
Jak widzisz wartość wyrażenia jest od razu przekazywana do funkcji printf . Czegoś takiego przy użyciu instrukcji if nie da się zrobić, bo nie zwraca ona żadnej wartości, a jedynie, w zależności od warunku, wykonuje te, lub inne instrukcje.