4.3. Операции сравнения и логические операции
4.3. Операции сравнения и логические операции
Символ операции
Значение
Использование
!
Логическое НЕ
!expr
меньше
exprexpr
=
Меньше либо равно
expr=expr
больше
exprexpr
=
больше либо равно
expr=expr
==
равно
expr==expr
!=
не равно
expr!=expr
логическое И
exprexpr
||
логическое ИЛИ
expr||expr
Примечание. Все операции в результате дают значение типа bool
Операции сравнения и логические операции в результате дают значение типа bool, то есть true или false. Если же такое выражение встречается в контексте, требующем целого значения, true преобразуется в 1, а false – в 0. Вот фрагмент кода, подсчитывающего количество элементов вектора, меньших некоторого заданного значения:
vectorint::iterator iter = ivec.beg-in() ;
while ( iter != ivec.end() ) {
// эквивалентно: e1em_cnt = e1em_cnt + (*iter some_va1ue)
// значение true/false выражения *iter some_va1ue
// превращается в 1 или 0
e1em_cnt += *iter some_va1ue;
++iter;
}
Мы просто прибавляем результат операции “меньше” к счетчику. (Пара += обозначает составной оператор присваивания, который складывает операнд, стоящий слева, и операнд, стоящий справа. То же самое можно записать более компактно: elem_count = elem_count + n. Мы рассмотрим такие операторы в разделе 4.4.)
Логическое И () возвращает истину только тогда, когда истинны оба операнда. Логическое ИЛИ (||) дает истину, если истинен хотя бы один из операндов. Гарантируется, что операнды вычисляются слева направо и вычисление заканчивается, как только результирующее значение становится известно. Что это значит? Пусть даны два выражения:
expr1 expr2
expr1 || expr2
Если в первом из них expr1 равно false, значение всего выражения тоже будет равным false вне зависимости от значения expr2, которое даже не будет вычисляться. Во втором выражении expr2 не оценивается, если expr1 равно true, поскольку значение всего выражения равно true вне зависимости от expr2.
Подобный способ вычисления дает возможность удобной проверки нескольких выражений в одном операторе AND:
while ( ptr != О
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 различаются. Где мы промахнулись?
// Внимание! это не сравнение 3 переменных друг с другом
if ( ival != jva1 != kva1 )
// do something ...
Значения 0, 1 и 0 дают в результате вычисления такого выражения true. Почему? Сначала проверяется ival != jval, а потом итог этой проверки (true/false – преобразованной к 1/0) сравнивается с kval. Мы должны были явно написать:
if ( ival != jva1 ival != kva1 jva1 != kva1 )
// сделать что-то ...
Упражнение 4.4
Найдите неправильные или непереносимые выражения, поясните. Как их можно изменить? (Заметим, что типы объектов не играют роли в данных примерах.)
(a) ptr-iva1 != 0
(с) ptr != 0 *ptr++
(e) vec[ iva1++ ] = vec[ ival ];
(b) ival != jva1 kva1 (d) iva1++ ival
Упражнение 4.5
Язык С++ не диктует порядок вычисления операций сравнения для того, чтобы позволить компилятору делать это оптимальным образом. Как вы думаете, стоило бы в данном случае пожертвовать эффективностью, чтобы избежать ошибок, связанных с предположением о вычислении выражения слева направо?
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Операции сравнения
Операции сравнения Операции сравнения используются для сопоставления операндов. В этих операциях операндами могут быть не только числа, но и строки, логические величины и объекты. В табл. 11.8 приведены все операции сравнения.Таблица 11.8. Операции сравнения В листинге 11.10
Логические операции
Логические операции Логические операции позволяют комбинировать выражения, возвращающие логические величины. Язык JavaScript поддерживает три логические операции.Операция логического И (&&) возвращает true, если только оба операнда истинны. Например, (1<7)&&(3>2). При
Логические операции
Логические операции Для создания объектов более сложных, чем изначальные звезды, прямоугольники и эллипсы, мы можем использовать логические операции. Это гораздо проще, чем полноценная векторная графика, где мы будем создавать фигуры с нуля.Для выполнения логических
R.5.10 Операции сравнения на равенство
R.5.10 Операции сравнения на равенство выражение-равенства: выражение-отношения выражение-равенства == выражение-отношения выражение-равенства != выражение-отношенияОперации == (равно) и != (не равно) аналогичны операциям отношения, за исключением того, что их приоритет
IV. Логические операции
IV. Логические операции Обычно логические операции "считают" условные выражения операндами. Операция ! имеет один операнд, расположенный справа. Остальные операции имеют два операнда: один слева и один справа. && Логическое И: результат операции имеет значение "истина",
Поразрядные логические операции
Поразрядные логические операции Четыре операции производят действия над данными, относящимися к классу целых, включая char. Они называются "поразрядными", потому что выполняются отдельно над каждым разрядом независимо от разряда, находящегося слепа или справа. ~ :
Логические операции
Логические операции Логические операции выполняют над своими операндами логические функции И (&&) и ИЛИ (||). Операнды логических операций могут иметь целый, плавающий тип, либо быть указателями. Типы первого и второго операндов могут различаться. Сначала всегда
7.3. Операции сравнения
7.3. Операции сравнения сравнение целых чисел-eqравноif [ "$a" -eq "$b" ]-neне равноif [ "$a" -ne "$b" ]-gtбольшеif [ "$a" -gt "$b" ]-geбольше или равноif [ "$a" -ge "$b" ]-ltменьшеif [ "$a" -lt "$b" ]-leменьше или равноif [ "$a" -le "$b" ]<меньше (внутри двойных круглых скобок )(("$a" < "$b"))<=меньше или равно (внутри двойных
Пример 7-5. Операции сравнения
Пример 7-5. Операции сравнения #!/bin/basha=4b=5# Здесь переменные "a" и "b" могут быть как целыми числами, так и строками.# Здесь наблюдается некоторое размывание границ#+ между целочисленными и строковыми переменными,#+ поскольку переменные в Bash не имеют типов.# Bash выполняет
Логические операции
Логические операции В XSLT имеются две логические операции — or и and. Эти операции бинарны, то есть каждая из них определена для двух операндов. Если операнды не являются булевыми значениями, они неявным образом приводятся к булевому типу.Семантика or и and очевидна — они
3.2.4 Побитовые логические операции
3.2.4 Побитовые логические операции Побитовые логические операцииamp; ! ^ ~ »» ««применяются к целым, то есть к объектам типа char, short, int, long и их unsigned аналогам, результаты тоже цлые.Одно из стандартных применений побитовых логических опраций – реализация маленького множества
Логические операции
Логические операции К логическим относятся бинарные операции and, or и xor, а также унарная операция not, имеющие операнды типа boolean и возвращающие значение типа boolean. Эти операции подчиняются стандартным правилам логики: a and b истинно только тогда, когда истинны a и b, a or b истинно
Операции сравнения
Операции сравнения Операции сравнения <, >, <=, >=, =, <> возвращают значение типа boolean и применяются к операндам простого типа и к строкам.Операции = и <> также применяются ко всем типам. Для размерных типов по умолчанию сравниваются значения, для ссылочных типов -
4.1. Логические переменные и логические операции
4.1. Логические переменные и логические операции Информация (данные, машинные команды и т. д.) в компьютере представлена в двоичной системе счисления, в которой используется две цифры – 0 и 1. Электрический сигнал, проходящий по электронным схемам и соединительным