ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 3) онлайн
Условная операция
В этом разделе пойдет разговор об операции, выполняющей несколько нетипич- ные действия. Существует распространенная в программировании ситуация: пе- ременной необходимо присвоить одно значение в случае выполнения некоторого условия и другое значение в случае невыполнения этого условия. В следующем фрагменте переменной min присваивается наименьшее из значений alpha и beta с помощью конструкции if...else:
if ( alpha < beta )
min = alpha; else min = beta;
Подобные действия на практике оказались настолько распространенными, что была специально разработана условная операция, выполняющая эти дейст- вия. Эта операция записывается с помощью двух знаков и использует три опе-
ранда. Она является единственной операцией в C++, использующей более двух операндов. С помощью условной операции можно записать предыдущий фраг- мент следующим образом:
min = ( alpha < beta ) ? alpha : beta;
Правая часть оператора представляет собой условное выражение: ( alpha < beta ) ? alpha : beta // условное выражение
Знак вопроса ? и двоеточие : обозначают условную операцию. Условие, сто- ящее перед знаком вопроса
( alpha < beta )
является условием проверки. Это условие, вместе с переменными alpha и beta, составляет тройку операндов условной операции.
Если значение проверяемого условия истинно, то условное выражение ста- новится равным значению alpha; в противном случае оно становится равным beta. Скобки вокруг проверяемого условия не обязательны, но их довольно час- то употребляют для того, чтобы упростить визуальное восприятие этого опера- тора. На рис. 3.14 показан синтаксис оператора условия, а на рис. 3.15 — меха-
низм его действия.

Рис. 3.15. Исполнение условного оператора
Значение условного выражения можно присваивать другим переменным и ис- пользовать его в любом месте, где допускается использование переменной. В дан- ном примере условное выражение используется с переменной min.
Приведем пример использования условной операции для нахождения абсо- лютной величины (модуля) числа.
absvalue = (n) < 0 ? - (n) : (n);
Если значение n окажется меньше нуля, то условное выражение принимает значение, противоположное n; в противном случае оно становится равным n. Полученное значение присваивается переменной absvalue.
Следующая программа, CONDI.cpp, использует условную операцию для выво- да последовательности символов 'x', разделенных 8 пробелами.
// condi.cpp
// печать символа 'x' каждые 8 позиций
// с применением условной операции
#include <iostream>
using namespace std;
int main()
{
for ( int j=0; j<80 ; j++) // для каждой позиции
{ //значение ch равно 'x', если
char ch = (j%8) ? ' ' : 'x'; // номер позиции кратен 8,
cout <<ch; // в противном случае ch содержит пробел
}
return 0;
}
Правая часть вывода частично не видна на экране из-за его ширины, но весь вывод выглядит однородно:
x x x x x x x x x x
Переменная j в цикле пробегает значения от 0 до 79, а операция остатка от деления j на 8, использующаяся как часть условия, принимает нулевое значение только тогда, когда j кратно 8. Таким образом, условное выражение
(j%8) ? ' ' : 'x';
принимает значение '' в тех случаях, когда j не кратно 8, и значение 'x', когда j кратно 8.
Кажется, что такая форма записи уже максимально сократила размер кода, однако это не так. Мы можем исключить из кода переменную ch, соединив два оператора в один следующим образом:
cout << ( (j%8) ? ' ' : 'x');
Некоторые «горячие головы» любят уплотнять код настолько, насколько это возможно. Однако делать это совсем не обязательно, и зачастую максимальное сокращение размера кода не стоит усилий, прилагаемых программистом к его сжатию. Даже использование условной операции зависит только от вашего жела- ния: конструкция if...else с добавлением небольшого числа строк кода выполня- ет эквивалентную последовательность действий.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
