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