logo
Харви Дейтел, Пол Дейтел Как программировать на С++ / 02-Deitel-Стр-115-214

138 Глава 2

if (semesterAverage >= 90 || finalExam >= 90) cout « "Оценка студента - А" « endl;

Этот оператор также содержит два простых условия. Условие seme-sterAverage >= 90 проверяется, чтобы определить, заслужил ли студент оцен­ки А за курс в результате постоянной работы в течение семестра. Условие finalExam >= 90 проверяется, чтобы определить, заслужил ли студент оценки А за курс вследствие выдающихся результатов на заключительном экзамене. Затем оператор if рассматривает комбинацию этих условий

semesterAverage >= 90 || finalExam >= 90

и присуждает студенту оценку «А», если любое из этих условий или оба они истины. Отметим, что сообщение «Оценка студента - А» не печатается только, если оба простых условия ложны (если их значения равны 0). На рис. 2.29 приведена таблица истинности для логической операции ИЛИ (||).

Операция && имеет более высокий приоритет, чем операция ||. Обе эти операции имеют ассоциативность слева направо. Выражение, содержащее опе­рации && и ||, оценивается только до тех nop^_ пока его истинность или ложность не станет очевидной. Таким образом, анализ выражения

gender == 1 && age >= 65

будет немедленно остановлен, если значение gender не равно 1 (т.е. условие в целом заведомо ложно), и продолжится, если значение gender равно 1 (т.е. в целом может оказаться истинным, если будет истинным условие age >= 65).

Типичная ошибка программирования 2.21

В выражениях, использующих операцию &&, может оказаться, что одно условие -назовем его зависимым — может требовать, чтобы другое условие было значимо при оценке зависимого условия. В этом случае зависимое условие должно быть помещено после другого условия, в противном случае может произойти ошибка.

Совет по повышению эффективности 2.6

В выражениях, использующих операцию &&, если отдельные условия независимы друг от друга, записывайте комбинированное условие так, чтобы самым левым было то простое условие, которое вероятнее всего окажется ложным. В выражениях, ис­пользующих операцию ||, записывайте комбинированное условие так, чтобы самым левым было то простое условие, которое вероятнее всего окажется истинным. Это может сократить время выполнения программы.

выражение 1

выражение 2

выражение 1 |

выражение 2

0

0

0

0

ненулевое

1

ненулевое

0

1

ненулевое

ненулевое

1

Рис. 2.29.Таблица истинности операци^ (логическое ИЛИ)

Управляющие структуры 139

С++ содержит операцию ! (логическое отрицание), чтобы программист мог изменить значение условия на «противоположное». В отличие от опера­ций && и ||, которые комбинируют два условия (и, следовательно, являются бинарными операциями), операция отрицания имеет в качестве операнда только одно условие (и, следовательно, является унарной операцией). Опе­рация логического отрицания помещается перед соответствующим условием, когда мы хотим выбрать некоторый вариант расчета в случае, если перво­начально (без учета операции логического отрицания) это условие ложно. Приведем пример фрагмента программы:

if ( !(grade == sentineValue) )

cout « "Следующая оценка - " « grade « endl;

Скобки, в которые помещено условие grade == sentineValue необходимы, так как операция логического отрицания имеет более высокий приоритет, чем операция проверки равенства. На рис. 2.30 приведена таблица истин­ности операции логического отрицания.

выражение

логическое отрицание выражения

0

1

1

0

Рис. 2.30. Таблица истинности операции ! (логическое отрицание)

В большинстве случаев программист может избежать применения логи­ческого отрицания, изменив выражение условия с помощью соответствующих операций отношения и проверки равенства. Например, предыдущий оператор может быть записан в виде

if ( grade != sentineValue )

cout « "Следующая оценка - " « grade « endl;

Подобная гибкость часто может помочь программисту выразить условие в наиболее естественном и удобном виде.

Таблица на рис. 2.31 показывает приоритеты и ассоциативность операций С++, рассмотренных к настоящему моменту. Операции представлены сверху вниз в порядке их старшинства.

2.20. Ошибки случайной подмены операций проверки равенства (==) и присваивания (=)

Есть один тип ошибок, который программисты на С++, независимо от их квалификации, делают так часто, что мы решили уделить ему отдельный раздел. Речь идет о случайной подмене операций проверки равенства (==) и присваивания (=). Подобные подмены очень неприятны, поскольку обычно они не приводят к синтаксическим ошибкам. Ошибочные операторы обычно нормально компилируются, программа запускается на выполнение, но ре­зультаты получаются ошибочными из-за логических ошибок выполнения.

140