带有格式说明符和输入不匹配的Scanf

带有格式说明符和输入不匹配的Scanf,c,C,使用%d说明符将字符传递给scanf会产生32760左右的随机数。我正在使用Ubuntu 16.04提供的GCC。 显然,我的猜测是,这是一种未指明的行为。但是你知道引擎盖下面发生了什么吗 以下是上述目标的明显代码: #include <stdio.h> void main() { int n; scanf("%d", &n); printf("\n%d", n); } 这给了我一行十个零的输出。 我很困惑。这个问题可能不有趣,我明白了。但我还是忍不住想知道为

使用
%d
说明符将字符传递给scanf会产生32760左右的随机数。我正在使用Ubuntu 16.04提供的GCC。 显然,我的猜测是,这是一种未指明的行为。但是你知道引擎盖下面发生了什么吗

以下是上述目标的明显代码:

#include <stdio.h>

void main() {
  int n;
  scanf("%d", &n);
  printf("\n%d", n);
}
这给了我一行十个零的输出。
我很困惑。这个问题可能不有趣,我明白了。但我还是忍不住想知道为什么。因此,我仍然不能排除scanf的影响。

我将您的程序更改为

#include <stdio.h>

int main() {
  int n;
  printf("%d\n", n);
  scanf("%d", &n);
  printf("%d\n", n);
}
因此,无论是什么导致
n
以32767的位模式开始,它都不是
scanf
正在做的事情


在某种程度上,这是有趣的,甚至是迷人的:尽管我使用的是一个非常不同的系统(MacOS 10.9.5下的clang-600.0.57),但我得到了一个非常相似的结果。但不管这有多有趣,我都不会浪费时间试图找出原因,因为这很难,而且也不会教我任何关于编写适当程序的有用知识。这只是一些随机的、毫无意义的巧合。

大家好,欢迎来到StackOverflow!目前,您没有向我们显示任何代码,所以几乎不可能知道问题来自何处。请阅读并在问题中添加一个。您真的在使用“%d”吗?您必须传递一个字符串说明符,即您应该使用“%d”而不是“%d”。除非您共享代码,否则我们无法帮助您。@DouglasMedeiros请阅读标题。不匹配是故意的。你说“这是未指定的行为”,这就是它。因此,询问为什么一个未初始化且未写入的变量会给出您得到的结果是毫无意义的。它是未定义的。我的前三次跑步产生了
1687249147
1692353513
2073092923
。那又怎么样?
#include <stdio.h>

int main() {
  int n;
  printf("%d\n", n);
  scanf("%d", &n);
  printf("%d\n", n);
}
32767
32767