The statements
if (a > b)
z = a;
else
z = b;
compute in z the maximum of a and b. The conditional
expression, written with the ternary operator ``?:'', provides an
alternate way to write this and similar constructions. In the expression
expr_{1} ? expr_{2} : expr_{3}
the expression expr_{1} is evaluated first. If it is nonzero
(true), then the expression expr_{2} is evaluated, and that is
the value of the conditional expression. Otherwise expr_{3} is
evaluated, and that is the value. Only one of expr_{2} and expr_{3}
is evaluated. Thus to set z to the maximum of a and b,
z = (a > b) ? a : b; /* z = max(a, b) */
It should be noted that the conditional expression is indeed an expression, and
it can be used wherever any other expression can be. If expr_{2}
and expr_{3} are of different types, the type of the result is
determined by the conversion rules discussed earlier in this chapter. For
example, if f is a float and n an int, then
the expression
(n > 0) ? f : n
is of type float regardless of whether n is positive.
Parentheses are not necessary around the first expression of a conditional
expression, since the precedence of ?: is very low, just above
assignment. They are advisable anyway, however, since they make the condition
part of the expression easier to see.
The conditional expression often leads to succinct code. For example, this
loop prints n elements of an array, 10 per line, with each column
separated by one blank, and with each line (including the last) terminated by a
newline.
for (i = 0; i < n; i++)
printf("%6d%c", a[i], (i%10==9  i==n1) ? '\n' : ' ');
A newline is printed after every tenth element, and after the nth. All
other elements are followed by one blank. This might look tricky, but it's more
compact than the equivalent ifelse. Another good example is
printf("You have %d items%s.\n", n, n==1 ? "" : "s");
