10

我对下一个代码有疑问:

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

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

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

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

4

3 回答 3

14

您根本不能依赖这种“工作”(即始终以可移植的方式做同样的事情),对于第二种情况,它在 C 中是未定义的行为,如果您的实现未定义__STDC_IEC_559__(这是,我相信,这些天很少见)。

C99,§6.5.5/5

/ 运算符的结果是第一个操作数除以第二个操作数的商;% 运算符的结果是余数。在这两种操作中,如果第二个操作数的值为零,则行为未定义。

你在一种情况下得到一个“不是数字”而不是在另一种情况下得到一个事实是,一个是在浮点算术中完成的,在你的实现中(符合 IEEE 754 除零语义),0/0给出了一个南。

在第二种情况下,您使用的是整数运算——未定义的行为,无法预测会发生什么。

于 2012-10-28T16:48:34.793 回答
10

您没有收到异常或错误的原因是因为对于 double、infinity 和 NaN 已定义(请参阅IEEE floating point)但是当您尝试对整数进行相同操作时,您会收到错误,因为 NaN/Infinity 不是定义

于 2012-10-28T16:46:55.653 回答
4

这是因为IEEE 754标准定义了正无穷和负无穷的特殊值以及浮点值的“非数字”。

像这样的非浮点类型int没有定义那些特殊值,因此运行时由于未处理的错误而被终止。

这不是 C 特定的,您将在其他语言中看到非常相似(如果不相同)的行为,仅仅是因为此功能取决于硬件。

于 2012-10-28T16:49:17.290 回答