Expresii conditionale
Instructiunile
if (a < b)
z = a;
else
z = b;
calculeaza desigur in z maximul dintre a si b. Expresia conditio-
nala, scrisa cu operatorul ternar "? :" ofera un mod alternativ
pentru a scrie acest lucru precum si constructii similare. In
expresia:
e1 ? e2 : e3
expresia e1 se evalueaza prima. Daca ea este nonzero (adevara-
ta) atunci se evalueaza expresia e2 si aceasta este valoarea
expresiei conditionale. Altminteri, se evalueaza e3 si aceasta
este valoarea. Numai una din expresiile e2 si e3 se evalueaza.
Deci, pentru a pune in z maximul dintre a si b:
z = (a > b) ? a : b; /* z = max(a, b) */
Trebuie sa notam ca expresia conditionala este intr-adevar o
expresie si ca ea poate fi folosita exact ca oricare alta expre-
sie. Daca e2 si e3 sint expresii de tipuri diferite, tipul
reultatului se determina dupa regulile de conversie discutate mai
inainte in acest capitol. De exemplu, daca f este un float si n
este un int, atunci expresia
(n > 0) ? f : n
este de tipul double, indiferent daca n este pozitiv sau nu.
Parantezele nu sint necesare in jurul primei expresii
a unei expresii conditionale, deoarece ponderea lui ? : este
foarte mica, chiar deasupra asignarii. Ele sint totusi recoman-
date, pentru a face partea de conditie a expresiei mai usor de
vazut.
Expresiile conditionale conduc adesea la un cod succint.
De exemplu, bucla urmatoare tipareste N elemente ale unui tablou,
10 pe linie, cu fiecare coloana separata printr-un blanc si cu
fiecare linie (inclusiv ultima) terminata cu un singur caracter
"linie noua".
for (i = 0; i << N; i++)
printf("%6d%c", a[i], (i % 10 == 9 || i == N-1) ? '\n' : ' ');
Un caracter "linie noua" se tipareste tot dupa al zecelea
element si dupa al N-lea element. Toate celelalte elemente sint
urmate de un blanc. Cu toate ca seamana cu un truc, este instruc-
tiv sa incercati sa scrieti lucrul acesta fara a folosi expresia
conditionala.
Exercitiul 2.10. Rescrieti functia lower, care converteste
literele mari in litere mici, cu o expresie conditionala in
locul lui if-else.