х = (у < 0) ? -у: у;
Все, что находится между знаком = и точкой с запятой, представляет собой условное выражение. Смысл этого оператора можно выразить так: “если у меньше нуля, то х = -у, иначе х = у”. С помощью оператора if else это можно выразить следующим образом:
if (У < 0) х = -у;
else
х = у;
Ниже показана общая форма условного выражения:
выражение! ? выражение2 : выражениеЗ
Если выражение1 имеет истинное (ненулевое) значение, то все условное выражение принимает то же значение, что и выражение2. Если выражение! имеег ложное (нулевое) значение, то все условное выражение получает то же значение, что и выражениеЗ.
Управляющие операторы С: ветвление и переходы 271
Условное выражение можно использовать в ситуации, когда переменной необходимо присвоить одно из двух возможных значений. Типичным примером может служить установка переменной в большее из двух значений:
max = (а > b) ? а: b;
Здесь переменной max присваивается значение а, если оно большеb, и b в противном случае.
Обычно с помощью оператора if else можно достичь того же самого, что и посредством условной операции. Однако версия с условной операцией короче и в зависимости от компилятора может дать в результате более компактный код.
Давайте для примера рассмотрим программу в листинге 7.8. Эта программа вычисляет, сколько банок краски необходимо для того, чтобы покрасить заданное количество квадратных футов поверхности. Основной алгоритм прост: нужно разделить общее число квадратных футов на количество квадратных футов, которые можно покрасить содержимым одной банки. Тем не менее, предположим, что ответом будет 1,7 банки. В магазине можно купить только полные, а не частично заполненные банки, поэтому придется приобрести две банки. Следовательно, программа должна округлять ответ до следующего целого числа. Для обработки такой ситуации применяется условная операция, и она также используется при выводе слова “банка” или “банки”.
Листинг 7.8. Программа paint.с

Ниже показан пример выполнения программы:
Введите число квадратных футов, которые необходимо покрасить:
349
Для этого потребуется 1 банка краски.
Введите следующее значение (или q для завершения) :
351
Для этого потребуется 2 банки краски.
Введите следующее значение (или q для завершения) :
q
Поскольку в программе применяется тип int, дробная часть результата от деления усекается, т.е. 351/350 дает 1. Таким образом, количество банок округляется до ближайшего меньшего целого. Если sq feet % COVERAGE равно 0, то sq feet делится на
272 глава 7
COVERAGE без остатка, поэтому значение cans остается без изменений. В противном случае имеется остаток, и значение cans увеличивается на 1. Это достигается с помощью следующего оператора:
cans += ((sq_feet % COVERAGE == 0)) ? 0: 1;
Он добавляет к cans значение выражения, указанного справа от знака +=. Выражение справа — это условное выражение, принимающее значение 0 или 1 в зависимости от того, делится ли sq_feet на COVERAGE без остатка.
Последний аргумент функции printf() также является условным выражением:
cans == 1 ? "банка" : "банки");
Если значение переменной cans равно 1, используется строка "банка", в противном случае — строка "банки". Это демонстрирует возможность применения в условной операции строк в качестве второго и третьего операндов.
Сводка: условная операция Условная операция
О;
Общий комментарий
Эта операция принимает три операнда, каждый из которых является выражением: Операция имеет следующую форму:
выражение1 ? выражение2 : выражениеЗ
Значение всего выражения равно значению выражение2, если выражение1 истинно, и значению выражениеЗ в противном случае.
Примеры
(5 > 3) ? 1 : 2 получает значение 1.
(3 > 5) ? 1 : 2 получает значение 2.
(а > b) ? а : b получает большее значение среди а и ь.
Вспомогательные средства для циклов:
continue И break
Обычно после входа в тело цикла программа выполняет все находящиеся там операторы, прежде чем проводить очередную проверку условия цикла. Операторы continue и break позволяют пропускать часть цикла и даже прекращать его выполнение в зависимости от результатов проверки, производимой внутри тела цикла.
Оператор continue
Этот оператор может использоваться во всех трех формах циклов. Когда он встречается, он вызывает пропуск оставшейся части итерации и начало новой итерации. Если оператор continue указан внутри вложенной структуры, он воздействует только на самую внутреннюю структуру, содержащую его. Давайте опробуем continue в короткой программе, показанной в листинге 7.9.
Читать дальше