以下代码是否正确?据我所知,它不应该正常工作,但在Dev-C ++编译器上,确实如此。有人可以详细解释一下吗?
#include<limits.h>
int main()
{
long int num_case=LONG_MAX;
scanf("%d",&num_case);
printf("%ld",num_case);
return 0;
}
由于
答案 0 :(得分:4)
与标准C库告诉您不要做的大多数事情一样,它会调用未定义的行为。未定义意味着它可能在某些条件下工作,但在您最不期望的时候崩溃。
在这种情况下,它起作用,因为long int
和int
实际上是相同的数字表示:四个字节,两个补码。使用另一个平台(例如x86-64 Linux),情况可能并非如此,您可能会看到某种问题。特别是,8字节long int
的高位字节将保持未初始化状态。
编辑:询问“但它会崩溃”是以错误的方式思考。根据语言标准,仅允许将未初始化的字节读入类型long int
的变量中以使C程序崩溃。我们不需要找到一个这样做的平台的例子,以了解该程序是不明确的。这就是重点。 C不会立即向您发出规则手册,它会等到您移植并打破初始假设。
答案 1 :(得分:1)
正如RageD所说,你真的应该在scanf()
电话中使用%ld。它起作用的原因是因为在您的系统上(或者在我看来),int
和long int
的大小相同(可能是4),因此scanf()
不会覆盖任何内存它不应该。
答案 2 :(得分:0)
通常在32位系统上,long int有32位(与int相同),在64位系统中,long int有64位(与long long int相同)。如果您希望代码可移植,请使用带有“%ld”的scanf。