Язык Си - [52]

Шрифт
Интервал

равно 0. Мы думаем, что смысл второй формы записи менее очевиден, чем первой. Однако в результате компиляции она оказывается более эффективной, так как при реализации про граммы требует меньшего числа машинных операций.

Осложнения с понятием "истина"

     Растяжимость понятия истина в языке Си может привести и к неприятностям. Рассмотрим следующую программу:

/* занятость */

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.


Еще от автора Митчел Уэйт
Язык программирования C [Лекции и упражнения, 6-е изд.]

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.