关于除以零,标准说:
C99 6.5.5p5 - / 运算符的结果是第一个操作数除以第二个的商;% 运算符的结果是余数。在这两种操作中,如果第二个操作数的值为零,则行为未定义。
C++03 5.6.4 - 二元 / 运算符产生商,二元 % 运算符产生第一个表达式除以第二个表达式的余数。如果 / 或 % 的第二个操作数为零,则行为未定义。
如果我们从表面上看上面的段落,答案显然是两种语言的未定义行为。但是,如果我们进一步查看 C99 标准,我们会看到以下段落似乎是矛盾的 (1):
C99 7.12p4 - 宏 INFINITY 扩展为浮点类型的常量表达式,表示正或无符号无穷大(如果可用);
标准是否有某种黄金法则,即未定义的行为不能被(可能)矛盾的陈述所取代?除此之外,我认为如果您的实现定义了 INFINITY 宏,那么除以零被定义为这样的结论是不合理的。但是,如果您的实现没有定义这样的宏,则行为是未定义的。
我很好奇这两种语言在这个问题上的共识是什么(如果有的话)。如果我们谈论整数除法int i = 1 / 0
与浮点除法,答案会改变float i = 1.0 / 0.0
吗?
注意 (1) C++03 标准谈到了<cmath>
包含 INFINITY 宏的库。