携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情
其他真值
既然1或0可以作为while语句的测试表达式,是否可以用其他数字呢?
用其他数字来表示
#include <stdio.h>
int main() {
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;
}
运算结果
执行第1个循环时,n分别是3,2,1,当n等于0时,第一个循环结束。与此类似,执行第2个循环时,n分别是-3,-2,-1.当n等于0时,第2个循环结束。一般而言,所有的非0值都视为真,只有0被视为假。在C语言中,真的概念很广。
也就是说,只要测试条件的值为非0,就会执行while循环。这是从数值方面而不是从真/假方面来看测试条件。要牢记:关系表达式为真,求值得1;关系表达式为假,求值得0.因此,这些表达式实际上相当于数值。
我们可以利用这一特性。例如,用while(goats)替换while(goats!=0),因为表达式goats!=0和goats都只有goats的值为0时才为0或假。第1中形式while(goats)才是C常用的,大家应该熟悉这种写法。
无限循环的问题的产生
无限循环的问题的产生:程序一直运行,用户在输入q后完全没机会继续输入。如果
scanf()读取指定形式的输入失败,就把无法读取的输入留在输入队列中,供下次读取。当scanf()把q作为整数读取失败了,它把q留下。在下次循环时,scanf()从上次读取失败的地方(q)开始读取,scanf()把q作为整数读取,又失败了。因此,这样修改后不仅创造了一个无限循环,还创建一个无限失败的循环。