Программирование >>  Структурное программирование 

1 ... 46 47 48 [ 49 ] 50 51 52 ... 342


if (semesterAverage >= 90 finalExam >= 90) cout << Оценка студента - A endl;

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

semesterAverage >= 90 finalExam >= 90

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

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

gender == 1 && age >= 65

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

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

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

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

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

выражение 1

выражение 2

выражение 111 выражение 2

ненулевое

ненулевое

ненулевое

ненулевое

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



выражение

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

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

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

if ( grade != sentineValue )

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

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

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

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

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

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

if ( !(grade == sentineValue) )

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

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



Операция

Ассоциативность

Тип операций

слева направо

круглые скобки

+ - + - ! (тип)

справа налево

унарные

/ %

слева направо

мультипликативные

слева направо

аддитивные

слева направо

поместить в/взять из

< <= > >=

слева направо

отношение

слева направо

проверка на равенство

&&

слева направо

логическое И

слева направо

логическое ИЛИ

справа налево

условная

+= -= *= /= %=

справа налево

присваивание

слева направо

запятая (последование)

Рис. 2.31. Приоритеты и ассоциативность операций

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

if (payCode == 4)

cout Вы получили премию! << endl;

но случайно написали

if (payCode = 4)

cout << Вы получили премию! << endl;

Первый оператор if должным образом присуждает премию тому, чей pay-Code равен 4. Второй оператор if (ошибочный) оценивает значение операции присваивания в условии if постоянным значением 4. Поскольку любое ненулевое значение интерпретируется как true, условие в данном операторе if всегда истинно, и премии будут получать все, независимо от действительной величины payCode! Более того, переменная payCode будет изменена, хотя предполагается, что она должна только проверяться!

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

Использование операции == для присваивания или операции = для проверки равенства.

Обычно программисты записывают подобные условия как х == 7, т.е. помещают имя переменной слева, а константу - справа. Если переставить их так, чтобы константа была слева, а имя переменной справа, т.е. записать



1 ... 46 47 48 [ 49 ] 50 51 52 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика