Условные выражения

Начинающих программистов иногда сбивает с толку то обстоятельство, что любое допустимое в С++ выражение может быть использовано для управления предложением if. Отсюда видно, что условное выражение не обязательно должно содержать только операторы отношения или логические и операнды типа bool. Требуется только, чтобы результат вычисления управляющего предложения мог рассматриваться как истинный или ложный. Вспомним, что значение 0 автоматически преобразуется в false, а все ненулевые значения в true. Таким образом, любое выражение, результатом которого является 0 или ненулевое значение, может быть использовано для управления предложением if. Приведем в качестве примера программу, которая считывает с клавиатуры два целых числа и выводит их частное. Предложение if, управляемое вторым числом, используется для предотвращения деления на ноль.

// Использование значения value для управления предложением if

#include <iostream>

#include <conio.h>

#include <cstdlib>

using namespace std;

int main()

{

int a, b;

cout << “Enter delimoe: “;

cin >> a;

cout << “Enter delitel: “;

cin >> b;

if (b) cout “Result: “<< a / b << ‘\n’;

else cout << "Delenie на ноль недопустимо. \n";

return 0;

}

Ниже приведены два пробных прогона программы:

Введите делимое: 12

Введите делитель: 2

Результат: 6

Введите делимое: 12

Введите делитель: 0

Результат: Деление на ноль недопустимо

Обратите внимание на то, что значение b (делитель) проверяется на ноль с помощью конструкции if(b). Такой метод вполне допустим, так как если b равно 0, условие, управляющее предложением if, ложно, и выполняется предложение else. В противном случае условие истинно (не 0). и выполняется деление. Нет никакой необходимости писать это предложение if таким образом:

if (b==0) cout “Result: “<< a / b << ‘\n’;

Такая форма предложения избыточна, неэффективна и многими программистами на С++ считается дурным стилем.

3.5.3. Троичный (тернарный) условный оператор?

Условный оператор? — единственный оператор в языке C++, который работает сразу с тремя операндами. Он получает три выражения и возвращает значение:

(выражение1)? (выражение2): (выражениеЗ)

Эту строку можно прочитать так: "Если выражение1 истинно, возвратить значение выражения2, в противном случае возвратить значение выражения3". Как правило, это значение присваивается переменной. Следующий пример демонстрирует применение условного оператора? вместо оператора if..else.

stroka =(grade >=60)? “зачет”: “незачет”;

cout << stroka;

3.5.4.Вложенные операторы if...else

Для множественного выбора можно использовать вложенные операторы if...else, помещая один оператор if...else внутрь другого. Например, следующий оператор псевдокода Если...Иначе будет печатать А при экзаменационной оценке, большей или равной 90, В — при оценке, лежащей в диапазоне от 80 до 89, С — при оценке в диапазоне 70-79, D — при оценке в диапазоне 60-69 и F — при других оценках.

Если оценка студента больше или равна 90 Напечатать "А"

Иначе

Если оценка студента больше или равна 80

Напечатать "В"

Иначе

Если оценка студента больше или равна 70

Напечатать "С"

Иначе

Если оценка студента больше или равна 60

Напечатать "D" Иначе

Напечатать "F"

Этот псевдокод может быть записан на языке С+ + в виде

if (studentGrade >= 90) // 90 и более получает оценку "А"

cout «"А";

else

if (studentGrade >= 80) // 80-89 получает "В"

cout «"В";

else

if (studentGrade >= 70) // 70-79 получает "С"

cout «"С";

else

if (studentGrade >= 60) // 60-69 получает "D"

cout «"D";

else // менее 60 получает "'F" cout «"F",

Если studentGrade (оценка студента) больше или равна 90, то четыре условия истинны, но будет выполнен только оператор cout, расположенный после проверки первого условия. После того как этот оператор cout выполнен, часть else внешнего оператора if...else пропускается. Большинство программирующих на С++ предпочтут записать предыдущий оператор if в виде

if (studentGrade >= 90) // 90 и более получает оценку "А"

cout «"А";

else if (studentGrade >= 80) // 80-89 получает "В"

cout «"В";

else if (studentGrade >= 70) // 70-79 получает "С"

cout «"С";

else if (studentGrade >= 60) // 60-6960-69 получает "D"

cout «"D";

else // менее 60 менее 60 получает "F"

cout «"F";

Обе формы эквивалентны, отличаясь только отступами и вертикальной разрядкой, которые компилятором игнорируются. Последняя форма более популярна, поскольку она позволяет избежать сдвига кода далеко вправо. Подобный сдвиг часто оставляет мало места в строке, заставляя дробить и переносить строки, что ухудшает читаемость программы.

Вложенные операторы if...else могут работать намного быстрее, чем последовательность операторов if с одиночным выбором, так как возможен ранний выход после удовлетворения одного из условий.

Во вложенных операторах if...else проверяйте сначала условия, которые с большей вероятностью окажутся равными true. Это способствует более быстрому выполнению вложенных операторов if...else и более раннему выходу из них, чем при проверке в начале редких случаев.

Проблема «висящего else»

Компилятор С++ всегда ассоциирует else с ближайшим непосредственно предшествующим if, если только не указано иначе (посредством фигурных скобок { и }). Такое поведение компилятора может приводить к тому, что называют «проблемой висящего else». Например,

if (х > 5)

if (У > 5)

cout «"х and у are > 5";

else

cout «"x is <= 5";

указывает, что если х больше 5, вложенный оператор if проверяет, является ли у также большим 5. Если это так, печатается «х and у are > 5». В противном случае, если х меньше или равен 5, часть else оператора if...else, по-видимому, должна печатать «х is <= 5».

Но не торопитесь! Этот вложенный оператор if...else выполняется не так, как кажется на первый взгляд. На самом деле компилятор интерпретирует его как

if (х > 5)

if (У > 5)

cout «"х and у are > 5";

else

cout «"x is <= 5";

где телом первого if является вложенный if...else. Внешний оператор if проверяет, является ли х большим 5. Если да, то выполнение продолжается проверкой, является ли у также большим 5. Если второе условие истинно, выводится «х and у are > 5». Однако если второе условие ложно, выводится строка "x is <= 5", хотя х больше 5.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: