С++ для начинающих




Операции сравнения и логические операции - часть 2


Подобный способ вычисления дает возможность удобной проверки нескольких выражений в одном операторе AND:

while ( ptr != О &&

        ptr->va1ue < upperBound &&

        ptr->va1ue >= 0 &&

        notFound( ia[ ptr->va1ue ] ))

{ ... }

Указатель с нулевым значением не указывает ни на какой объект, поэтому применение к нулевому указателю операции доступа к члену вызвало бы ошибку (ptr->value). Однако, если ptr равен 0, проверка на первом шаге прекращает дальнейшее вычисление подвыражений. Аналогично на втором и третьем шагах проверяется попадание величины ptr->value в нужный диапазон, и операция взятия индекса не применяется к массиву ia, если этот индекс неправилен.

Операция логического НЕ дает true, если ее единственный оператор равен false, и наоборот. Например:

bool found = false;

// пока элемент не найден

// и ptr указывает на объект (не 0)

while ( ! found && ptr ) {

    found = 1ookup( *ptr );

    ++ptr;

}

Подвыражение

! found

дает true, если переменная found равна false. Это более компактная запись для

found == false

Аналогично

if ( found )

эквивалентно более длинной записи

if ( found == true )

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

// Внимание! Порядок вычислений не определен!

if ( ia[ index++ ] < ia[ index ] )

    // поменять местами элементы

Программист предполагал, что левый операнд оценивается первым и сравниваться будут элементы ia[0] и ia[1]. Однако компилятор не гарантирует вычислений слева направо, и в таком случае элемент ia[0] может быть сравнен сам с собой. Гораздо лучше написать более понятный и машинно-независимый код:

if ( ia[ index ] < ia[ index+1 ] )

    // поменять местами элементы

    ++index;

Еще один пример возможной ошибки. Мы хотели убедиться, что все три величины ival, jval и kval различаются. Где мы промахнулись?




Содержание  Назад  Вперед