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
- 116 Глава 2
- 2.13. Основы повторения, управляемого счетчиком
- 2.14. Структура повторения for (цикл)
- 120 Глава 2
- 122 Глава 2
- 2.15. Пример использования структуры for
- 124 Глава 2
- 126 Глава 2
- 2.16. Структура множественного выбора switch
- Глава 2
- 130 Глава 2
- 132 Глава 2
- 2.17. Структура повторения do/while
- 134 Глава 2
- 2.18. Операторы break и continue
- Глава 2
- 2.19. Логические операции
- 138 Глава 2
- Глава 2
- 2.21. Заключение по структурному программированию
- IfcrpyKTypa (единственный выбор)
- Глава 2
- Глава 2
- 148 Глава 2
- Глава 2
- Глава 2
- Глава 2
- 156 Глава 2
- 158 Глава 2
- 160 Глава 2
- 2.1. А) следование, выбор и повторение, b) if/else. С) управляемым счет чиком или определенным заранее, d) Метку, сигнал, флаг или лож ный сигнал.
- 162 Глава 2
- 164 Глава 2
- 166 Глава 2
- 168 Глава 2
- 170 Глава 2
- 172 Глава 2
- 174 Глава 2
- 176 Глава 2
- 178 Глава 3
- Глава 3
- 3.3. Математические библиотечные функции
- 3.4. Функции
- Глава 3
- 3.5 Определения функций
- 184 Глава 3
- 186 ГлаваЗ
- 3.6. Прототипы функций
- 188 Глава 3
- 3.7. Заголовочные файлы
- 3.8. Генерация случайных чисел
- Глава 3
- 192 Глава 3
- 194 Глава 3
- 3.9. Пример: азартная игра
- Глава 3
- 198 Глава 3
- 3.10. Классы памяти
- 200 Глава 3
- 3.11. Правила, определяющие область действия
- 202 Глава 3
- 204 Глава 3
- 3.12 Рекурсия
- Глава 3
- 6) Значения, возвращаемые после каждого рекурсивного вызова
- 3.13. Пример использования рекурсии: последовательность чисел Фибоначчи
- Глава 3
- 3.14. Рекурсии или итерации
- 212 Глава 3
- Глава 3
- Глава 4
- Глава 5
- Глава 6
- 3.15. Функции с пустыми списками параметров
- 214 Глава 3
- 3.16. Встраиваемые функции