c – 使用Long Int的%d

以下代码是否正确?据我所知,它应该不能正常工作,但在Dev-C编译器上,确实如此.有人可以详细解释一下吗?

#include<limits.h>

int main()
{
long int num_case=LONG_MAX;

scanf("%d",&num_case);

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

谢谢

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

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

编辑:问“但它会崩溃”是错误的想法.根据语言标准,仅允许将未初始化的字节读入long int类型的变量中会导致C程序崩溃.我们不需要找到一个这样做的平台的例子,以了解该程序是不明确的.这就是重点. C不会立即向您发出规则手册,它会等到您移植并打破初始假设.

转载注明原文:c – 使用Long Int的%d - 代码日志