Так же как это обычно происходило в наших предыдущих программах, данная программа начинает свое выполнение с чтением символа и проверки, является ли он признаком конца файла. Дальше появляется нечто новое - оператор, использующий логическую операцию "и"
, обозначаемую &&. Смысл действий, осуществляемых оператором if в данном случае, можно пояснить следующим образом:Если прочитанный символ не пробел, И
не символ "новая строка", И не символ табуляции, то происходит увеличение значения переменной charcount на единицу. Все выражение будет истинным, если указанные три условия истинны. Логические операции имеют меньший приоритет, чем операции отношения, поэтому не было необходимости использовать
В языке Си имеются три логические операции:
&& | И | ||
|| | ИЛИ | ||
! | НЕ |
Предположим, что expl
и ехр2 - два простых условных выражения типа cat > rat или debt = = 1000. Тогда:1. expl && ехр2
: истинно в том и только в том случае, когда оба выражения expl и ехр2 истинны.2. expl || ехр2
: истинно в том случае, если какое-нибудь из выражений expl или ехр2 истинно или оба истинны.3. !expl
: истинно, если выражение expl ложно, и наоборот.Ниже приведено несколько конкретных примеров:
5 > 2 && 4 > 7: ложно, поскольку истинно только одно подвыражение.
5 > 2 || 4 > 7: истинно, поскольку по крайней мере одно из подвыражений истинно.
!(4 > 7): истинно, потому что 4 не больше 7.
Последнее выражение к тому же эквивалентно следующему:
Если вы совсем не знакомы с логическими операциями или испытываете трудности при работе с ними, помните, что практика && время = = совершенство
.Приоритеты
Операция !
имеет очень высокий приоритет, он выше, чем у умножения, такой же, как у операций увеличения, и только круглые скобки имеют более высокий приоритет. Приоритет операции && больше чем операции ||, а обе они имеют более низкий приоритет, чем операции отношения, но более высокий, чем операция присваивания. Поэтому выражение:интерпретировано так:
т. е. b
содержится между с и а или b больше d.Порядок вычислений
Обычно в языке Си не определяется, какие части сложного выражения будут вычисляться вначале. Например, в операторе:
выражение 5 + 3
может быть вычислено до вычисления выражения 9 + 6, или наоборот (Приоритеты, присвоенные операциям гарантатируют, что оба выражения будут вычислены перед выполнением операции умножения.) Эта неопределенность была оставлена в языке, чтобы создатели компилятора имели возможность в конкретной системе осуществлять наиболее эффективный выбор. Исключением из этого правила (или его нарушением) является выполнение логических операций. Язык Си гарантирует, что логические выражения вычисляются слева направо. Более того, гарантируется также, что, как только обнаруживается элемент, значение которого устанавливает ложность всего выражения как целого, вычисление данного выражения прекращается. Это дает возможность использовать конструкции типа:В результате вычисления первого подвыражения переменная с
получает свое значение, которое затем можно использовать во втором подвыражении. Если бы такой порядок вычислений не гарантировался, при выполнении программы компьютер, возможно, проверял бы истинность второго выражения перед нахождением значения переменной с.Приведем еще один пример:
Если значение переменной number
равно 0, то все выражение ложно, и поэтому дальнейшее вычисление данного условного выражения прекращается. Это избавляет компьютер от последствий деления на нуль. Многие языки не обеспечивают выполнения подобного требования, и, выяснив, что number равно 0, компьютер переходит к проверке следующего условия.Резюме: логические операции и выражения
1. ЛОГИЧЕСКИЕ ОПЕРАЦИИ
Операндами логических операций обычно являются условные выражения. У операции !=
имеется только один операнд. Остальные имеют по два - один слева от знака и другой справа от него.&& И|| ИЛИ! НЕ
II. ЛОГИЧЕСКИЕ ВЫРАЖЕНИЯ