netlib.narod.ru< Назад | Оглавление | Далее >

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

Операторы отношения это

    >  >=  <  <=

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

    ==  !=

Операторы отношения имеют более низкий приоритет, чем арифметические, поэтому выражение вроде 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< Назад | Оглавление | Далее >

Сайт управляется системой uCoz