Язык Си - руководство для начинающих
Шрифт:
Примеры:
Отношение 5 > 2: истинно и имеет значение 1.
Отношение (2 + а) = = а: ложно и имеет значение 0.
ЛОГИЧЕСКИЕ ОПЕРАЦИИ
Иногда бывает полезным объединить два или более условных выражения. Например, предположим, нам требуется программа, которая подсчитывает только "непустые" символы, т. е. мы хотим знать число символов, не являющихся пробелами, символами "новая
/* число символов */
/* подсчитывает не пустые символы */
main
{
int ch;
int charcount = 0;
while ((ch = getchar) != EOF)
if(ch !=' ' && ch \='\n' && ch != '\t') charcount++;
printf(" Всего %d непустых символов. \n", charcount);
}
Так же как это обычно происходило в наших предыдущих программах, данная программа начинает свое выполнение с чтением символа и проверки, является ли он признаком конца файла. Дальше появляется нечто новое - оператор, использующий логическую операцию "и", обозначаемую &&. Смысл действий, осуществляемых оператором 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.
Последнее выражение к тому же эквивалентно следующему:
4 < = 7.
Если вы совсем не знакомы с логическими операциями или испытываете трудности при работе с ними, помните, что практика && время = = совершенство.
Приоритеты
Операция ! имеет очень высокий приоритет, он выше, чем у умножения, такой же, как у операций увеличения, и только круглые скобки имеют более высокий приоритет. Приоритет операции && больше чем операции ||, а обе они имеют более низкий приоритет, чем операции отношения, но более высокий, чем операция присваивания. Поэтому выражение:
а > b && b > c || b > d
интерпретировано так:
((a > b) && (b > с)) || (b > d)
т. е. b содержится между с и а или b больше d.
Порядок вычислений
Обычно в языке Си не определяется, какие части сложного выражения будут вычисляться вначале. Например, в операторе:
apples = (5 + 3)*(9 + 6);
выражение 5 + 3 может быть вычислено до вычисления выражения 9 + 6, или наоборот (Приоритеты, присвоенные операциям гарантатируют, что оба выражения будут вычислены перед выполнением операции умножения.) Эта неопределенность была оставлена в языке, чтобы создатели компилятора имели возможность в конкретной системе осуществлять наиболее эффективный выбор. Исключением из этого правила (или его нарушением) является выполнение логических операций. Язык Си гарантирует, что логические выражения вычисляются слева направо. Более того, гарантируется также, что, как только обнаруживается элемент, значение которого устанавливает ложность всего выражения как целого, вычисление данного выражения прекращается. Это дает возможность использовать конструкции типа:
while((c = getchar) != EOF && с != '\n')
В результате вычисления первого подвыражения переменная с получает свое значение, которое затем можно использовать во втором подвыражении. Если бы такой порядок вычислений не гарантировался, при выполнении программы компьютер, возможно, проверял бы истинность второго выражения перед нахождением значения переменной с.
Приведем еще один пример:
if (number !=0 && 12/number ==2) printf(" Число равно 5 или 6.\n" );