|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我想问一个可能是没有意义的问题;
在C语言中我输入如下代码:
printf("%d",0/0);
编译器会报错,因为0/0没有意义;
但是如果我输入如下代码:
int main()
{
printf("%lf\n",0/(double)0);
printf("%.1lf\n",0/(double)0);
printf("%d",0/(double)0);
}
程序输出如下:
-1.#IND00
-1.$
0
--------------------------------
Process exited after 0.06026 seconds with return value 0
请按任意键继续. . .
这是为什么?是无规律的乱码不用管吗?还是有什么特别原因在里面?
在C语言中,进行 0 除以 0 的操作是一种未定义行为,因为在数学上,除数不能为0。然而,你在代码中进行了一些类型转换和打印操作,导致了不同的输出结果。
1. printf("%lf\n",0/(double)0);:这一行代码中,将整型的0除以浮点型的0。这会导致得到一个特殊值 - "Not a Number"(NaN)。在 printf 中,"%lf" 格式化字符串用于打印 double 类型的值,因此输出结果为 "-1.#IND00",表示不确定的值。
2. printf("%.1lf\n",0/(double)0);:在这一行中,由于除法得到的是 NaN,printf 可能无法正确地格式化这个非数字的结果,因此输出看起来像是乱码 "-1.$"。
3. printf("%d",0/(double)0);:在这行中,浮点数 NaN 被强制转换为整数类型输出,由于在C语言中,NaN 被视为不等于任何数字,包括 0,所以输出结果为 0。
总的来说,这些输出并不是无规律的乱码,而是反映了计算机在处理非法操作时的内部表现方式。需要注意的是,这种行为是未定义的,这意味着其结果可能因编译器和系统的不同而异。在实际编程中,应该避免使用未定义的行为,以确保程序的可移植性和可预测性。
|
|