Листинг 6.6. Программа t and f.c

Управляющие операторы С: циклы 209

В листинге 6.6 двум переменным присваиваются значения двух выражений отношений. С целью простоты переменной true_val присваивается значение истинного выражения, а переменной false val — значение ложного выражения. Запуск этой программы дает следующий простой вывод:
true = 1; false = О
Теперь все должно проясниться. В языке С истинное выражение имеет значение 1, а ложное выражение — 0. И действительно, в определенных программах на С для циклов, которые должны выполняться бесконечно, используется следующая конструкция, т.к. 1 всегда означает истинное значение:
while (1)
{
}
Что еще является истинным?
Если 1 или 0 допускается использовать в качестве условия проверки в операторе while, то можно ли применять для этих целей другие числа? И если да, то что произойдет? Давайте поэкспериментируем на примере программы, показанной в листинге 6.7.
Листинг 6.7. Программа truth, с

Получаются следующие результаты:
3 является истинным 2 является истинным 1 является истинным О является ложным -3 является истинным -2 является истинным -1 является истинным О является ложным
210 глава 6
Первый цикл выполняется, когда переменная n принимает значения 3, 2 и 1, но пре кращает выполнение, когда n равна 0. Подобным же образом второй цикл выполняется, когда переменная n принимает значения -3, -2 и -1, но завершается, как только n становится равной 0. В общем случае осе ненулевые значения рассматриваются как истинные, а ложным считается только 0. В языке С истина имеет очень широкое толкование!
Говоря по-другому, цикл while выполняется до тех пор, пока в результате вычисления его условия проверки получается ненулевое значение. Это обстоятельство перемещает условия проверки из рамок “истина/ложь” в числовую область. Имейте в виду, что условное выражение принимает значение 1, если оно истинно, и 0, если ложно, поэтому все выражения подобного рода в действительности являются числовыми.
Многие программирующие на С пользуются этим свойством условий проверки. Например, конструкцию while (goats ! = 0) можно заменить while (goats), поскольку выражения (goats !=0) и (goats) принимают значение 0, те. ложное, только когда переменная goats равна 0. Вы должны в достаточной мере попрактиковаться с формой while (goats), чтобы она стала привычной.
Затруднения с понятием истины
Довольно широкое толкование понятия истины в С может приводить к затруднениям. Например, давайте внесем одно тонкое изменение в программу из листинга 6.1, получив в результате программу, показанную в листинге 6.8.
Листинг6.8. Программа trouble.с

Запуск программы из листинга 6.8 дает следующий вывод:
Введите целое число для последующего суммирования (или q для завершения программы) : 20 Введите следующее целое число (или q для завершения программы): 5
Введите следующее целое число (или q для завершения программы) : 30
Введите следующее целое число (или q для завершения программы) : q
Введите следующее целое число (или q для завершения программы):
Введите следующее целое число (или q для завершения программы):
Введите следующее целое число (или q для завершения программы):
Введите следующее целое число (или q для завершения программы):
и т.д. до тех пор, пока вы не прервете выполнение программы.
Управляющие операторы С: циклы 211
К такому плачевному результату привело изменение, внесенное в условие проверки оператора while, когда выражение status == 1 было заменено выражением status = 1. Второе выражение — это оператор присваивания, который устанавливает переменную status в 1. Более того, значением оператора присваивания является значение его левой части, поэтому status = 1 имеет то же самое числовое значение 1. Следовательно, с практической точки зрения этот цикл while дает такой же результат, как и while (1) — т.е. цикл никогда не завершится. В случае ввода q переменная status устанавливается в 0, однако при проверке условия цикла status получает значение 1 и инициирует следующую итерацию.
Читать дальше