netlib.narod.ru | < Назад | Оглавление | Далее > |
Операторы отношения это
> >= < <=
Все они имеют одинаковый приоритет. Сразу за ними идет приоритет операторов проверки равенства:
== !=
Операторы отношения имеют более низкий приоритет, чем арифметические, поэтому выражение вроде i < lim - 1 будет выполняться так же, как i < (lim - 1), т.е. как мы и ожидаем.
Более интересны логические операторы && и ||. Выражения, связанные между собой операторами && или ||, вычисляются слева направо. Вычисление прекращается, как только становится известна истинность или ложность результата. Многие программы на Си опираются на это свойство, как, например, цикл из функции getline, которую мы приводили в главе 1:
for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) s[i] = c;
Прежде чем читать очередной символ, нужно проверить,есть ли для него место в массиве s, иначе говоря, соблюдение условия i < lim - 1 должно проверяться первым. Если это условие не выполняется, мы не должны продолжать работу, в частности читать следующий символ. Также было бы неправильным сравнивать с и EOF до обращения к getchar; следовательно, вызов функции и присваивание должны выполняться перед проверкой символа в переменной c.
Приоритет оператора && выше, чем приоритет оператора ||, однако их приоритеты ниже, чем приоритет операторов сравнения. Из сказанного следует, что выражение вида
i < lim -1 && (c = getchar()) != '\n' && c != EOF
не нуждается в дополнительных скобках. Но, так как приоритет != выше, чем приоритет присваивания, в выражении
(c = getchar()) != '\n'
скобки необходимы, чтобы сначала выполнить присваивание, а затем сравнение с '\n'.
Согласно стандарту численным результатом вычисления выражения отношения или логического выражения является 1, если оно истинно, и 0, если оно ложно.
Унарный оператор ! преобразует ненулевой операнд в 0, а нуль в 1. Обычно оператор ! используют в конструкциях вида
if (!valid)
вместо
if (valid == 0)
Трудно сказать, какая из форм записи лучше. Конструкция вида !valid легко читается («если не правильно»), но в более сложных выражениях может оказаться, что понять ее назначение сложнее.
Упражнение 2-2 |
Напишите цикл, эквивалентный приведенному выше циклу for, не пользуясь операциями && и ||. |
netlib.narod.ru | < Назад | Оглавление | Далее > |