Что касается деления на ноль, стандарты говорят:
C99 6.5.5p5 - результатом оператора/является фактор от деления первого операнда на второй; результатом оператора% является остаток. В обеих операциях, если значение второго операнда равно нулю, поведение undefined.
С++ 03 5.6.4. Двоичный/оператор дает частное, а двоичный оператор% дает остаток от деления первого выражения на второе. Если второй операнд/или% равен нулю, поведение undefined.
Если бы мы взяли вышеуказанные абзацы по номинальной стоимости, ответ явно Undefined Поведение для обоих языков. Однако, если мы посмотрим дальше в стандарте C99, мы увидим следующий параграф, который представляется противоречивым (1):
C99 7.12p4 - макрос INFINITY расширяется до постоянного выражения типа float, представляющего положительную или беззначную бесконечность, если доступно;
Есть ли у стандартов какое-то золотое правило, где Undefined Поведение не может быть заменено (потенциально) противоречивым утверждением? Не допуская этого, я не считаю необоснованным сделать вывод о том, что если ваша реализация определяет макрос INFINITY, то деление на ноль определяется как таковое. Однако, если ваша реализация не определяет такой макрос, поведение undefined.
Мне интересно, какой консенсус (если таковой имеется) по этому вопросу для каждого из двух языков. Будет ли ответ изменяться, если мы говорим о целочисленном делении int i = 1 / 0
по сравнению с делением с плавающей запятой float i = 1.0 / 0.0
?
Примечание (1) В стандарте С++ 03 рассказывается о библиотеке <cmath>
, которая включает макрос INFINITY.