Книга: Язык программирования Си. Издание 3-е, исправленное

2.6 Операторы отношения и логические операторы

2.6 Операторы отношения и логические операторы

Операторами отношения являются


›=

‹=

Все они имеют одинаковый приоритет. Сразу за ними идет приоритет операторов сравнения на равенство:

== 
!=

Операторы отношения имеют более низкий приоритет, чем арифметические, поэтому выражение вроде i ‹ lim-1 будет выполняться так же, как i ‹ (lim-1), т.е. как мы и ожидаем.

Более интересны логические операторы && и ||. Выражения, между которыми стоят операторы && или ||, вычисляются слева направо. Вычисление прекращается, как только становится известна истинность или ложность результата. Многие Си-программы опираются на это свойство, как, например, цикл из функции getline, которую мы приводили в главе 1:

for (i = 0; i ‹ lim-1 && (с = getchar()) != EOF && с != 'n'; ++i)
 s[i] = c;

Прежде чем читать очередной символ, нужно проверить, есть ли для него место в массиве s, иначе говоря, сначала необходимо проверить соблюдение условия i ‹ lim-1. Если это условие не выполняется, мы не должны продолжать вычисление, в частности читать следующий символ. Так же было бы неправильным сравнивать c и EOF до обращения к getchar; следовательно, и вызов getchar, и присваивание должны выполняться перед указанной проверкой.

Приоритет оператора && выше, чем таковой оператора ||, однако их приоритеты ниже, чем приоритет операторов отношения и равенства. Из сказанного следует, что выражение вида

i ‹ lim-1 && (с = getchar()) != 'n' && с != EOF

не нуждается в дополнительных скобках. Но, так как приоритет != выше, чем приоритет присваивания, в

(с = getchar()) != 'n'

скобки необходимы, чтобы сначала выполнить присваивание, а затем сравнение с 'n'.

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

Унарный оператор ! преобразует ненулевой операнд в 0, а нуль в 1. Обычно оператор ! используют в конструкциях вида

if (!valid)

что эквивалентно

if (valid == 0)

Трудно сказать, какая из форм записи лучше. Конструкция вида !valid хорошо читается ("если не правильно"), но в более сложных выражениях может оказаться, что ее не так-то легко понять.

Упражнение 2.2. Напишите цикл, эквивалентный приведенному выше or-циклу, не пользуясь операторами && и ||.

Оглавление книги


Генерация: 0.330. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз