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

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

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

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

main( )

{

int age = 20;

while(age++  <= 65)

{ if((age % 20) = =0) /* делится ли возраст на 20 ? */

    printf(" Вам %d. Поздравляем с повышением! ", age);

  if (age = 65)

    printf(" Вам %d. Преподносим Вам золотые часы ", 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), где обычно используются условные выражения для задания проверяемых условий, могут применяться любые выражения, причем ненулевое значение является истиной", а нуль - "ложью".

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Википедия: Платон или истина?

Из книги Журнал PC Magazine/RE №10/2009 автора Журнал «PC Magazine»

Википедия: Платон или истина? Александр Рябцев Все, кто пользуется Интернетом, знают, что такое «Википедия», и хотя бы раз к ней обращались. Но сказать, что «Википедия» – это энциклопедия, даже если добавить «онлайновая», мало: необходимо подчеркнуть ее существенное


Что такое истина?

Из книги Язык Си - руководство для начинающих автора Прата Стивен

Что такое истина?      Каждое условное выражение проверяется "истинно" ли оно или ложно. При этом возникает интересный вопрос: Что такое истина?      Мы можем ответить на этот вечный вопрос по крайней мере так, как он решен в языке Си. Напомним, во-первых, что выражение в Си


Итак, чему же все-таки соответствует истина?

Из книги Новый ум короля [О компьютерах, мышлении и законах физики] автора Пенроуз Роджер

Итак, чему же все-таки соответствует истина?      Мы можем использовать 1 и 0 в качестве проверочных значений оператора if. Спрашивается, можем ли мы использовать другие числа. Если да, то что при этом происходит? Давайте проведем эксперимент. /* if - тест */main( ){if (200)    printf("200 -