#include <stdio.h>
#include <stdlib.h>
//A simple program that asks for an integer and prints it back out.
int main()
{
int a;
printf("Type an integer: ");
scanf("%d",&a);
printf("The integer you typed is: %d",a);
}
如果用户键入诸如X
之类的字符,则由于某种原因,输出将始终为 64。为什么会这样?
这将调用未定义的行为。
如果scanf()
发生匹配失败("X"不是%d
的匹配),提供的参数将保持未赋值状态,并且由于参数是未初始化的局部变量,因此该值保持不确定。
相关,来自C11
,章节§7.21.6.2
[...]如果 输入项不是匹配序列,指令执行失败:这 条件是匹配失败。[...]
尝试使用该值将调用 UB。来自C11
附件J.2,未定义的行为
具有自动存储持续时间的对象的值在 定。
因此,您应该始终
- 初始化局部变量
- 检查
scanf()
的返回值。