Я нашел функцию в программе, которую я должен исправить, в которой определена функция mod
:
int mod(int a, int b)
{
int i = a%b;
if(i<0) i+=b;
return i;
}
Мне сказали, кстати, что a
и b
всегда будут положительными ...
Хм? if(i<0)
?
Аргумент состоит в том, что что
результатом операции по модулю является класс эквивалентности, и любой член этого класса может быть выбран в качестве представителя
И только как запоздалую мысль
...; однако обычным представителем является наименьший положительный остаток, наименьшее неотрицательное целое число, которое принадлежит этому классу, то есть остаток от евклидова деления. Однако возможны и другие соглашения.
Это означает, что 6 % 7
может вернуть 6
(пока все хорошо), но также и -1
. Хм ... правда? (Давайте проигнорируем тот факт, что представленная реализация не обрабатывает все случаи.)
Я знаю, что математически верно, что операция по модулю выглядит так. Но потом кто-то еще сказал мне, что C %
на самом деле «не реализует оператор по модулю, а все остальное».
Итак, как C определяет оператор %
?
В C-Draft я нахожу только
Результатом оператора / является частное от деления первого операнда на второй; результат оператора% - остаток. В обеих операциях, если значение второго операнда равно нулю, поведение не определено.
Означает ли это, что 6 % 7
всегда 6
? Или это тоже может быть -1
?