#include <stdio.h>
int main(void)
{
int i, j, k;
scanf("%d%d%d", &i, &j, &k);
printf("%d %d %d", i, j, k);
return 0;
}
如果我们输入1,2,3
,会发生什么?为什么?
根据https://stackoverflow.com/a/18297691/2646069,如果scanf()
读取意外字符串,它将提前返回,因此不会在最后一个成功值之后修改任何值。
我在-O0
上尝试了clang(LLVM 6.1.0),上面的解释是正确的,但在-O2
上,第二个变量总是一个随机数,但与scanf()
之前不一样1}},第三个变量始终为0
。
答案 0 :(得分:4)
根据the manual,scanf
的返回值告诉您使用这些参数是否安全。
成功完成后,这些函数将返回成功匹配和分配的输入项的数量;如果早期匹配失败,此数字可以为零。如果输入在第一次匹配失败或转换之前结束,则返回EOF。如果发生读取错误,则设置流的错误指示符,返回EOF
如果您输入1,2,3
,则scanf
将返回1
,表示第一个参数可以安全使用,并且第一个,
发生匹配失败因为它与根据格式字符串的预期输入不匹配。
如果您在此之后使用j
或k
,那么您的代码将使用不确定的值,这是未定义的行为,显然是要避免的不稳定行为的来源... 检查scanf
的返回值非常重要,因为您使用的链接也鼓励。
答案 1 :(得分:0)
explanation给出的是正确的。 scanf
会在输入中找到,
时停止并返回。因此,j
和k
将被取消初始化。未初始化的变量具有不确定的值,如果它是陷阱表示,则会调用未定义的行为。