C语言中if条件判断结果异常及输入非数字时n==0判定为真的原因咨询
关于scanf输入非数字时变量判断异常的问题解答
这个问题的核心其实是未初始化局部变量的行为加上scanf处理输入失败时的规则,咱们一步步拆解清楚:
1. 先搞懂scanf遇到非数字输入时的行为
当你用scanf("%d", &n)读取输入时,如果输入的是像"m"这样的非数字字符,scanf没办法把它解析成整数,会直接读取失败。这时候关键的点来了:scanf失败时,不会对目标变量n做任何修改——也就是说n的值完全取决于它被定义后的初始状态。
2. 为什么输入"m"时n==0会判定为真?
你代码里的int n,i;是定义在函数内部的局部变量(自动变量),C语言里这类变量默认是不初始化的,它们会持有内存里残留的随机垃圾值。在你这次运行中,n的垃圾值刚好是0,所以n==0的条件就成立了,程序也就输出了"a"。
3. 为什么换成i时i==0会判定为假?
道理和上面完全一样——i也是未初始化的局部变量,它的垃圾值是随机的。只是这次运行时,i的垃圾值碰巧不是0,所以i==0的条件就不成立了。
本质上这属于C语言里的未定义行为:未初始化的局部变量取值没有任何保证,每次运行、甚至同一程序多次执行的结果都可能不一样,运气好可能是0,运气不好可能是任何随机数。
如何避免这种问题?
正确的做法是每次调用scanf后都检查它的返回值,判断输入是否成功:
#include <stdio.h> int main() { int n; // scanf返回成功读取的变量个数,这里如果成功读取整数会返回1 if (scanf("%d", &n) != 1) { printf("输入无效,请输入数字\n"); return 1; } if(n==0) printf("a"); else if (!(n>=1)) printf("b"); return 0; }
内容的提问来源于stack exchange,提问作者Kajal Singh
相关产品推荐
相关产品推荐

