short int a,b,c;
scanf("%d%d",&a,&b);
c = a + b;
printf("%d %d %d",a,b,c);
输入:5 8
输出:0 8 8
为什么a
的值为0?任何人都能解释一下吗?
平台--- GCC ubuntu 10.04
答案 0 :(得分:11)
scanf
格式的 "%d"
需要int*
个参数。你给它一个short int*
参数,因此你的程序的行为是未定义的。
如果你真的想知道为什么你得到了你得到的结果,我可以推测,但更正你的代码要容易得多:
scanf("%hd%hd", &a, &b);
您可以继续"%d"
使用printf
,因为short int
参数会提升为int
。您可以将"%hd"
与printf
一起使用,但这不是必需的。 (short int*
的{{1}}参数没有类似的推广。)
您可以放心地在这里停止阅读。
以下是关于您的错误代码中可能发生的事情的一些猜测。这不是解决方案;解决方案是纠正您的代码,使其完成您希望它执行的操作。但是,如果错误的代码错误行为可能会有所帮助。
假设int*
是16位,short
是32位,这是典型的。格式字符串中的第一个int
告诉"%d"
读取一个值(您给它scanf
)并将其存储到第二个参数{{1}指向的32位int中}}。由于5
只有16个buts,它将在&a
中存储一半的32位值,在另一个相邻的内存块中存储另一半。第二个a
与a
做同样的事情;它将"%d"
的32位表示的一半存储在&b
中,另一半存储在其他地方。
根据您的输出,第二个8
似乎导致b
将"%d"
中的值scanf
的低16位存储在8
中在b
中排序16位(值为0),覆盖第一个a
存储的值。请注意,第一个"%d"
中的高16位可能存储在其他位置,可能会破坏其他一些变量,或者可能写入其他未使用的内存。
结果是你在"%d"
中存储了0,在a
中存储了8,这解释了你得到的输出。
这一切都是非常具有推测性的,许多其他结果都是可能的。这种分析仅用 来跟踪错误代码的行为,目的是纠正它。编写故意利用这种东西的代码是一个非常糟糕的主意。该语言完全没有说明像这样的错误代码会做什么;它的行为在不同的系统上会有很大的不同,有不同的编译器设置,甚至取决于月亮的相位。
答案 1 :(得分:0)
答案 2 :(得分:0)
在VC ++ 6.0中,c
的值为13。
#include <stdio.h>
int main()
{
short int a,b,c;
scanf("%d%d",&a,&b);
c = a + b;
printf("%d + %d = %d\n",a,b,c);
return 0;
}