如果输入是一个字符,为什么这段代码输出64?

时间:2016-06-10 19:02:07

标签: c scanf

#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。为什么会这样?

1 个答案:

答案 0 :(得分:9)

这会调用undefined behavior

如果scanf()发生匹配失败(“X”不匹配%d),则提供的参数保持未分配状态,并且由于参数是未初始化的局部变量,因此值仍然存在不确定的。

相关,来自C11,章节§7.21.6.2

  

[...]如果   输入项不是匹配的序列,指令的执行失败:这   条件是匹配失败。 [...]

尝试使用该值会调用UB。来自C11附件J.2,未定义的行为

  

使用具有自动存储持续时间的对象的值   不确定的。

因此,你应该总是

  1. 初始化您的本地变量
  2. 检查scanf()
  3. 的返回值