Я знаю, что деление на ноль не допускается в математике, но могу ли я использовать модуль по нулю и какой ответ я должен получить?
Например
10%0 = ?
5%0 = ?
Стандарт определяет его как «неопределенный».
Практически во всех процессорах модуль выполняется с той же функциональностью, что и разделение. В современных больших процессорах это инструкция (например, x86). Чаще всего эта инструкция вызывает ловушку при делении на ноль, и это применимо независимо от того, собирается ли код использовать часть по модулю или частную.
Он не определен, так что процессоры и компиляторы могут свободно реализовывать то, что им нравится — например, если процессор просто возвращает то, что было введено в качестве входных данных, это также разрешено, или если это вызывает сбой всей ОС, по стандарту это тоже «хорошо».
Таким образом, модуль нуля так же плохо, как деление на ноль.
(Обратите внимание, что, как правило, деление с плавающей запятой на ноль НЕ перехватывает [по умолчанию] и создает значение бесконечности, за исключением случаев, когда деленное значение также равно нулю, и в этом случае вы получаете «не число»)
В C / C ++ это Неопределенное поведение, Вы можете получить различные результаты в зависимости от компилятора или даже разных экземпляров одной и той же программы.
Двоичный / оператор дает частное, а двоичный оператор%
дает остаток от деления первого выражения на
второй. Если второй операнд / или% равен нулю, поведение
не определено
Результат UB
C11dr §6.5.5 «Результатом оператора / является частное от деления первого операнда на второй; результатом оператора% является остаток. В обеих операциях, если значение второго операнда равно нулю, поведение не определено «.
Говоря математически, вы должны получить бесконечность, что является правильным ответом … программно любой здравомыслящий компилятор предупредит вас о делении на ноль, поскольку внутренне оператор по модулю (по крайней мере в C / C ++) переводится в деление (в большинстве реализаций). Таким образом, ответ на ваш вопрос заключается в том, что вы получите исключение с плавающей запятой в обоих случаях.