3

下面的代码是否正确?据我了解,它不应该正常工作,但在 Dev-C++ 编译器上,它可以。有人可以详细解释一下吗?

#include<limits.h>

int main()
{
long int num_case=LONG_MAX;

scanf("%d",&num_case);

printf("%ld",num_case);
return 0;
}

谢谢

4

3 回答 3

5

就像标准 C 库告诉您不要做的大多数事情一样,它会调用未定义的行为。未定义意味着它可能在某些条件下工作,但在您最不期望的时候崩溃。

在这种情况下,它之所以有效,是因为long intint实际上是相同的数字表示:四字节,二进制补码。对于另一个平台(例如 x86-64 Linux),情况可能并非如此,您可能会看到某种问题。特别是,8 字节的高位字节long int将保持未初始化状态。

编辑:问“但它会崩溃”是错误的想法long int根据语言标准,仅将未初始化的字节读入类型变量就可以使 C 程序崩溃。我们不需要找到一个这样做的平台示例,就可以理解该程序是错误指定的。这就是我想说的。C 不会马上把规则手册扔给你,它会等到你移植并打破最初的假设。

于 2012-04-26T06:16:04.013 回答
1

正如 RageD 所说,你真的应该在scanf()通话中使用 %ld 。它起作用的原因是因为在您的系统上(或者在我看来),int并且long int大小相同(可能是 4),因此scanf()不会覆盖它不应该覆盖的任何内存。

于 2012-04-26T06:17:03.493 回答
0

通常在 32 位系统上 long int 有 32 位(与 int 相同),而在 64 位系统上 long int 有 64 位(与 long long int 相同)。如果您希望您的代码可移植,请将 scanf 与“%ld”一起使用。

于 2012-04-26T06:19:54.343 回答