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

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

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

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

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