Язык С




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


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

=> > =< <

все они имеют одинаковое старшинство. Непосредственно за ни- ми по уровню старшинства следуют операции равенства и нера- венства:

== !=

которые тоже имеют одинаковое старшинство. операции отноше- ния младше арифметических операций, так что выражения типа I<LIM-1 понимаются как I<(LIM-1), как и предполагается. Логические связки && и \!\! более интересны. Выражения, связанные операциями && и \!\!, вычисляются слева направо, причем их рассмотрение прекращается сразу же как только ста- новится ясно, будет ли результат истиной или ложью. учет этих свойств очень существенен для написания правильно рабо- тающих программ. Рассмотрим, например, оператор цикла в счи- тывающей строку функции GETLINE, которую мы написали в главе 1. FOR(I=0;I<LIM-1 && (C=GETCHAR()) != '\N' && C != EOF; ++I) S[I]=C;

Ясно, что перед считыванием нового символа необходимо проверить, имеется ли еще место в массиве S, так что условие I<LIM-1 должно проверяться первым. И если это условие не вы- полняется, мы не должны считывать следующий символ. Так же неудачным было бы сравнение 'C' с EOF до обраще- ния к функции GETCHAR : прежде чем проверять символ, его нужно считать. Старшинство операции && выше, чем у \!\!, и обе они младше операций отношения и равенства. Поэтому такие выраже- ния, как

I<LIM-1 && (C = GETCHAR()) != '\N' && C != EOF

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

(C = GETCHAR()) != '\N'

кобки необходимы.

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

IF( ! INWORD )

Вместо

IF( INWORD == 0 )

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

Упражнение 2-1

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




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