12-其他真值
6.3.2 其他真值
既然 1 或 0 可以作为 while 语句的测试表达式,是否还可以使用其他数字?如果可以,会发生什么?我们用程序清单6.7来做个实验。
程序清单6.7 truth.c 程序
// truth.c -- 哪些值为真
#include <stdio.h>
int main(void)
{
int n = 3;
while (n)
printf("%2d is true\n", n--);
printf("%2d is false\n", n);
n = -3;
while (n)
printf("%2d is true\n", n++);
printf("%2d is false\n", n);
return 0;
}
该程序的输出如下:
3 is true
2 is true
1 is true
0 is false
-3 is true
-2 is true
-1 is true
0 is false
执行第1个循环时, n 分别是 3 、 2 、 1 ,当 n 等于 0 时,第1个循环结束。与此类似,执行第2个循环时, n 分别是 -3 、 -2 和 -1 ,当 n 等于 0 时,第2个循环结束。一般而言,所有的非零值都视为真,只有 0 被视为假。在C中,真的概念还真宽!
也可以说,只要测试条件的值为非零,就会执行 while 循环。这是从数值方面而不是从真 / 假方面来看测试条件。要牢记:关系表达式为真,求值得 1 ;关系表达式为假,求值得 0 。因此,这些表达式实际上相当于数值。
许多C程序员都会很好地利用测试条件的这一特性。例如,用 while (goats) 替换 while (goats != 0) ,因为表达式 goats != 0 和 goats 都只有在 goats 的值为 0 时才为 0 或假。第1种形式( while (goats != 0) )对初学者而言可能比较清楚,但是第2种形式( while (goats) )才是C程序员最常用的。要想成为一名C程序员,应该多熟悉 while (goats) 这种形式。