Elektronika - baza wiedzy

Cześć 11 kursu C/C++


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.