Язык Си - руководство для начинающих
Шрифт:
Приоритет операций отношения считается меньшим, чем у операций + и – , и больше, чем у операции присваивания. Например, значение выражения:
х > y + 2
то же, что и выражения
х > (у + 2)
Это означает также, что выражение
ch = getchar != EOF
эквивалентно
ch = (getchar != EOF)
поскольку
(ch = getchar) != EOF
Сами операции отношения можно разбить на две группы в соответствии с назначенными приоритетами:
группа операций более высокого приоритета: < <= => >
группа операций более низкого приоритета: = = !=
Подобно большинству остальных операций операции отношения выполняются слева направо. Поэтому под записью:
ех != wye == zee
подразумевается
(ex != wye) == zee
Следовательно, в соответствии с правилами языка Си сначала проверяется, равны ли значения переменных ех и wye. Результирующая величина, равная 1 или 0 (истина или ложь), затем сравнивается со значением zee. Мы не видим реальной необходимости использовать подобного сорта конструкцию, но считаем своим долгом указать на возможные следствия принятого порядка выполнения операций.
Читателю, озабоченному сохранением своего высокого приоритета, хотим напомнить, что полный список всех операций вместе с их приоритетами приведен в приложении В в конце книги.
Резюме: операции отношения и выражения
1. Операции отношения
С помощью каждой из приведенных ниже операции величина слева от знака сравнивается с величиной справа от него:
2. Больше
3. Больше или равно
4. Равно
5. Меньше или равно
6. Меньше
7. Не равно
УСЛОВHЫЕ ВЫРАЖЕНИЯ
Понятие условное выражение состоит из знака операции отношения и операндов, расположенных слева и справа от него. Если отношение истинно, значение условного выражения равно 1, если отношение ложно, значение условного выражения равно 0.
Примеры:
Отношение 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.
Последнее выражение к тому же эквивалентно следующему: