除以零 - c编程

wan*_*arn 9 c floating-point nan

我对下一个代码有疑问:

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

if(y==1) {.....}
....
....
return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

此外,当我将第一行更改为int x = 0; 现在时,存在运行时错误.有什么不同?

Mat*_*Mat 14

你根本不能依赖这个"工作"(即一直做同样的事情,可移植),对于第二种情况,它在C中是未定义的行为,如果你的实现没有定义,它也是第一种__STDC_IEC_559__(这是我相信,这些日子很少见.

C99,§6.5.5/ 5

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

你在一个案例中获得"非数字"而在另一个案例中没有获得的事实是,一个是在浮点算术中完成的,其中,在你的实现上(符合IEEE 754除以零语义),0/0给出了NaN的.

在第二种情况下,您使用整数算术 - 未定义的行为,没有预测会发生什么.

  • 这对于大多数系统来说实际上是错误的:C99,§F.1:"定义`__STDC_IEC_559__`的实现应符合本附件中的规范.如果指示C语言与IEC 60559之间的绑定,则IEC60559指定的行为除非另有说明,否则以引用方式采用.§F.3"`+`,`-`,`*`和`/`运算符提供IEC 60559加法,减法,乘法和除法运算." (3认同)

Suh*_*tel 10

你没有得到异常或错误的原因是因为对于double,infinity和NaN被定义(参见IEEE浮点)但是当你对整数尝试相同时,你会得到一个错误,因为NaN/Infinity不是定义

  • 你不会总是得到整数'0/0`的错误,这取决于实现. (3认同)