Относительно деления на нуль говорится в стандартах:
C99 6.5.5p5 - результатом / оператор является частное от подразделения первого операнда вторым; результатом оператора % является остаток. В обеих операциях, если значение второго операнда является нулем, поведение не определено.
C++ 03 5.6.4 - двоичный файл / оператор приводит к частному, и двоичный оператор % приводит к остатку от подразделения первого выражения вторым. Если второй операнд / или % является нулем, поведение не определено.
Если мы должны были взять вышеупомянутые абзацы по номиналу, ответом является явно Неопределенное Поведение для обоих языков. Однако, если мы смотрим далее вниз в стандарте C99, мы видим следующий параграф, который, кажется, противоречащий (1):
C99 7.12p4 - макро-БЕСКОНЕЧНОСТЬ разворачивает до константного выражения плавания типа представление положительной или неподписанной бесконечности при наличии;
Стандарты имеют своего рода золотое правило, где Неопределенное Поведение не может быть заменено (потенциально) противоречащим оператором? Запрещая это, я не думаю, что неблагоразумно прийти к заключению, что, если Ваша реализация определяет макрос БЕСКОНЕЧНОСТИ, деление на нуль определяется, чтобы быть таким. Однако, если Ваша реализация не определяет такой макрос, поведение Не определено.
Мне любопытно, что согласие (если таковые имеются) по этому вопросу для каждого из этих двух языков. Был бы ответ изменяться, если мы говорим о целочисленном делении int i = 1 / 0
по сравнению с делением с плавающей точкой float i = 1.0 / 0.0
?
Примечание (1) C++ 03 стандарта говорит о <cmath>
библиотека, которая включает макрос БЕСКОНЕЧНОСТИ.
Не вижу противоречия. Деление на ноль не определено, точка. Нигде в цитируемом тексте нет упоминания "... если не определена БЕСКОНЕЧНОСТЬ" .
Обратите внимание, что нигде в математике не определено, что 1/0 = бесконечность . Один мог бы интерпретировать это таким образом, но это личная интерпретация в стиле «кратчайшего пути», а не звуковой факт.
Почему?
Это не имеет математического смысла, это не значит, что 1 / x определяется как ∞ в математике в целом. Кроме того, вам понадобятся как минимум еще два случая: -1 / x и 0 / x также не могут равняться ∞.
См. деление на ноль в целом и раздел о компьютерной арифметике в частности.
Для макроса INFINITY: есть явный кодирование для представления +/- бесконечности в стандарте IEEE754, то есть, если все биты экспоненты установлены и все дробные биты очищены (если установлен дробный бит, он представляет NaN)
С моим компилятором (int ) INFINITY == -2147483648
, поэтому выражение, которое оценивается как int i = 1/0
, определенно даст неверные результаты, если будет возвращено INFINITIY
1/0 - это не бесконечность, а только
lim 1/x = ∞ (x -> +0)
У меня есть только проект C99. В §7.12/4 говорится:
Макрос
INFINITY
расширяется до постоянного выражения типа типа float, представляющее положительную или беззнаковую бесконечность, если доступно; иначе в положительную константу типа
float
, которая переполняется во время перевода.
Обратите внимание, что INFINITY
может быть определено в терминах переполнения с плавающей точкой, не обязательно с делением на ноль.