如果我们只看上面的段落,答案对于这两种语言显然都是“未定义行为”。然而,如果我们在 C99 标准的后面继续阅读,就会看到以下看似自相矛盾的段落(1):C99 6.5.5p5 - / 运算符的结果是第一个操作数除以第二个操作数的商; % 运算符的结果是余数。在这两种操作中,如果第二个操作数的值为零,则行为未定义。
C++03 5.6.4 - 二元 / 运算符产生商,二元 % 运算符产生第一个表达式除以第二个表达式的余数。如果 / 或 % 的第二个操作数为零,则行为未定义。
那么,标准是否有某种“黄金法则”,即未定义行为不能被(潜在地)自相矛盾的陈述所取代呢?如果没有的话,那么我认为,如果你的实现定义了 INFINITY 宏,那么除以零就被定义为这样。然而,如果你的实现没有定义这样的宏,那么行为是未定义的。C99 7.12p4 - 如果可用,宏 INFINITY 扩展为 float 类型的常量表达式,表示正无穷大或无符号无限大;
我很好奇对于这个问题,这两种语言是否有共识(如果有的话)。如果我们讨论整数除法 `int i = 1 / 0` 和浮点数除法 `float i = 1.0 / 0.0`,答案会改变吗?
注意(1):C++03 标准讨论了 `` 库,其中包括 INFINITY 宏。