除以零 - c编程

时间:2012-10-28 16:44:09

标签: c floating-point nan

我对下一个代码有疑问:

int main { 
double x = 0;
double y = 0/x;

if(y==1) {.....}
....
....
return 0;
}

当我在计算机上运行代码时,我没有遇到运行时错误,我看到y = -nan(0x8000000000000)。为什么不将运行时错误除以零?

此外,当我将第一行更改为int x = 0;时 现在有一个运行时错误。有什么区别?

3 个答案:

答案 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的,您将在其他语言中看到非常相似(如果不相同)的行为,因为此功能归功于硬件。