具有Long Int的%d

nik*_*kel 3 c printf scanf long-integer

以下代码是否正确?据我所知,它应该无法正常工作,但是在Dev-C ++编译器上,它可以。请有人详细解释吗?

#include<limits.h>

int main()
{
long int num_case=LONG_MAX;

scanf("%d",&num_case);

printf("%ld",num_case);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Pot*_*ter 5

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

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

编辑:问“但它会崩溃”是在想错误的方式long int根据语言标准,仅将未初始化的字节读入类型的变量将使C程序崩溃。我们不需要查找这样做的平台示例就可以了解该程序的指定不正确。这就是我想说的。C不会立即将规则手册扔给您,它会等到您移植并破坏初始假设。