我对下一个代码有疑问:
int main {
double x = 0;
double y = 0/x;
if(y==1) {.....}
....
....
return 0;
}
当我在计算机上运行代码时,我没有遇到运行时错误,我看到y = -nan(0x8000000000000)
。为什么不将运行时错误除以零?
此外,当我将第一行更改为int x = 0;
时
现在有一个运行时错误。有什么区别?
答案 0 :(得分:13)
你根本不能依赖这个“工作”(即一直做同样的事情,可移植),对于第二种情况,它在C中是未定义的行为,如果你的实现没有定义,它也是第一种__STDC_IEC_559__
(我认为,这些日子很少见。)
C99,§6.5.5/ 5
/运算符的结果是来自第一个操作数的除法的商 第二; %运算符的结果是余数。 在两个操作中,如果值为 第二个操作数为零,行为未定义。
你在一个案例中获得“非数字”而在另一个案例中没有的事实是,一个是在浮点运算中完成的,其中,在你的实现上(符合IEEE 754除以零语义) ,0/0
给出NaN。
在第二种情况下,你使用整数算术 - 未定义的行为,没有预测会发生什么。
答案 1 :(得分:10)
你没有得到异常或错误的原因是因为对于double,infinity和NaN被定义(参见IEEE floating point)但是当你对整数尝试相同时,你会收到一个错误,因为NaN /无限定未定义
答案 2 :(得分:4)
这是因为IEEE 754标准定义了正无穷大的特殊值以及浮点值的“非数字”。
非int
等非浮点类型没有定义这些特殊值,因此由于未处理的错误而终止了运行时。
这不是特定于C的,您将在其他语言中看到非常相似(如果不相同)的行为,因为此功能归功于硬件。