C语言关于真值的问题(接上一篇文章)

84 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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;
}

运算结果

Snipaste_2022-08-18_20-40-01.png

执行第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!=0goats都只有goats的值为0时才为0或假。第1中形式while(goats)才是C常用的,大家应该熟悉这种写法。

无限循环的问题的产生

无限循环的问题的产生:程序一直运行,用户在输入q后完全没机会继续输入。如果

scanf()读取指定形式的输入失败,就把无法读取的输入留在输入队列中,供下次读取。当scanf()把q作为整数读取失败了,它把q留下。在下次循环时,scanf()从上次读取失败的地方(q)开始读取,scanf()把q作为整数读取,又失败了。因此,这样修改后不仅创造了一个无限循环,还创建一个无限失败的循环。