ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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 с добавлением небольшого числа строк кода выполня- ет эквивалентную последовательность действий.

 

38