下面的代码正确吗?据我的理解,它应该不能正常工作,但是在Dev-C++编译器上,它可以正常工作。有人可以详细解释一下吗?
#include<limits.h>
int main()
{
long int num_case=LONG_MAX;
scanf("%d",&num_case);
printf("%ld",num_case);
return 0;
}
Thanks
与标准 C 库告诉您不要做的大多数事情一样,它会调用未定义的行为。未定义意味着它可能在某些条件下工作,但在您最意想不到的时候崩溃。
在这种情况下,它起作用是因为long int
and int
实际上是相同的数字表示形式:四个字节,二进制补码。对于其他平台(例如 x86-64 Linux),情况可能并非如此,您可能会看到某种问题。特别是8字节的高位字节long int
将保持未初始化状态。
EDIT:问“但它会崩溃吗”是错误的思维方式。仅将未初始化的字节读入类型变量long int
根据语言标准,允许 C 程序崩溃。我们不需要找到这样做的平台示例,就可以了解该程序的指定不明确。这就是我想说的。 C 不会立即向您扔出规则手册,它会等到您移植并打破最初的假设。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)