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