M. УЭИТ - Язык Си - руководство для начинающих
- Название:Язык Си - руководство для начинающих
- Автор:
- Жанр:
- Издательство:Мир
- Год:1988
- Город:Москва
- ISBN:5-03-001309-1 /русск./
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
M. УЭИТ - Язык Си - руководство для начинающих краткое содержание
Язык Си - руководство для начинающих - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
/* занятость */
main( )
{
int age = 20;
while(age++ <= 65)
{ if((age % 20) = =0) /* делится ли возраст на 20 ? */
printf(" Вам %d. Поздравляем с повышением!\n", age);
if (age = 65)
printf(" Вам %d. Преподносим Вам золотые часы \n", age);
} }
С первого взгляда вам может показаться, что результат работы программы будет выглядеть, например, так:
Вам 40. Поздравляем с повышением
Вам 60. Поздравляем с повышением
Вам 65. Преподносим Вам золотые часы
На самом деле, однако, выход будет таким:
Вам 65. Преподносим Вам золотые часы
Вам 65. Преподносим Вам золотые часы
Вам 65. Преподносим Вам золотые часы
Вам 65. Преподносим Вам золотые часы
Вам 65. Преподносим Вам золотые часы
и т. д.- до бесконечности.
В чем дело? Это произошло не только потому, что мы плохо спроектировали программу, но и потому, что мы забыли свои собственные предостережения и использовали выражение:
if (agе= 65)
вместо
if (age == 65)
Последствия ошибки оказались катастрофическими. Когда в процессе выполнения программа достигает указанного оператора, она проверит выражение ( аgе = 65). Это выражение, включающее в себя опреацию присваивания, имеет значение, которое совпадает со значением переменной, расположенной слева от знака, т.е. с 65 (в любом случае). Поскольку 65 не равно нулю, выражение считается истинным" и выполняется команда вывода на печать. Затем, когда в программе происходит передача управления на команду проверки условия в цикле while, значение переменной аgепо-прежнему равно 65, что меньше или равно 65. Условие оказывается истинным и величина аgеувеличивается до 66 (ввиду наличия операции увеличения ++в постфиксной форме), и тело цикла выполняется еще раз. Прекратится ли его выполнение на следующем шаге? Должно было бы, поскольку величина аgетеперь больше, чем 65. Когда программа опять попадает на наш ошибочный оператор ifпеременная аgеснова получит значение 65. В результате сообщение будет напечатано еще раз, затем тело цикла выполнится еще раз, и т.д. - до бесконечности (Конечно, если вы в конце концов не захотите остановить программу).
Подводя итоги, можно сказать, что операции отношения используется для образования условных выражений. Условное выражение имеет значение "1", когда оно истинно, и "0", если оно ложно. В операторах (таких как whileи if), где обычно используются условные выражения для задания проверяемых условий, могут применяться любые выражения, причем ненулевое значение является истиной", а нуль - "ложью".
Приоритеты операций отношения
Приоритет операций отношениясчитается меньшим, чем у операций +и -, и больше, чем у операции присваивания. Например, значение выражения:
х > y + 2
то же, что и выражения
х > (у + 2)
Это означает также, что выражение
ch = getchar( ) != EOF
эквивалентно
ch = (getchar( ) != EOF)
поскольку наличие у оператора !=, более высокого приоритета говорит о том, что она выполняется перед присваиванием. Поэтому значение переменной chможет стать либо 1, либо 0 ввиду того, что (getchar( ) != EOF)- условное выражение, значение которого присваивается переменной ch. Поскольку в примерах программ рассмотренных до сих пор, предполагалось, что переменная chполучает свое значение от функции getchar( ), мы использовали скобки, чтобы организовать выполнение операций в нужном порядке.
(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на единицу.
Все выражение будет истинным, если указанные три условия истинны. Логические операции имеют меньший приоритет, чем операции отношения, поэтому не было необходимости использовать дополнительные скобки для выделения подвыражений.
Читать дальшеИнтервал:
Закладка: