为什么while中scanf返回值判断大于1时失效,大于负数却正常运行?
C语言scanf返回值问题解答
这个现象完全由scanf函数的返回值规则决定,C标准对scanf返回值的定义如下:
- 正常读取时,返回成功匹配并赋值给参数列表变量的输入项个数
- 遇到输入流结束(EOF)时,返回固定值
EOF,标准库中EOF通常被定义为-1 - 遇到输入格式和占位符不匹配(比如给
%f输入字母)、读取失败时,返回0
接下来对应三种情况逐一解释:
原代码条件
while(scanf("%f",&num) > 0 )正常运行的原因
本次调用scanf只用到了1个%f占位符,只要成功读到合法浮点数,返回值就为1,满足>0的条件,循环正常执行;如果输入不匹配、或者遇到EOF,返回值为0或者-1,都不满足>0,循环退出,完全符合预期逻辑。修改为
>1、>2等更大正整数时无法工作的原因
单次调用scanf最多只能成功匹配1个输入项,返回值最大就是1,永远不可能大于1,所以循环条件永远不成立,循环体一次都不会执行,自然无法正常工作。修改为
>-1、>-2等更小负数时看似正常运行的原因
只要输入的都是合法数字,scanf返回值就是1,必然满足大于-1、-2的条件,循环正常执行;只有当遇到EOF时返回-1,才会触发条件不成立退出循环。
注意:这个逻辑存在隐患,如果不小心输入了非数字内容,
scanf会返回0,0仍然满足>-1的条件,循环会继续执行,此时num的值未定义,程序会出现不可预期的行为,只是测试时都输入合法数字,所以看起来运行正常。
内容的提问来源于stack exchange,提问作者WWoPPoWW
相关产品推荐
相关产品推荐

