В Википедии есть отличная статья на эту тему , включая историю и теорию.
Пока язык удовлетворяет свойству евклидова деления, что (a/b) * b + (a%b) == a
, оба этажаделение и усечение деление являются последовательными и арифметически разумными.
Конечно, людям нравится утверждать, что одно очевидно правильно, а другое явно неправильно, но у него больше характер священной войны, чем разумногообсуждение, и обычно оно больше связано с выбором их раннего предпочтительного языка, чем с чем-либо еще.Они также часто склонны спорить в первую очередь о выбранном %
, хотя, вероятно, имеет смысл сначала выбрать /
, а затем просто выбрать %
, который соответствует.
- Настил (например,Python):
- Не менее авторитетный, чем предполагает это Дональд Кнут.
%
, следуя знаку делителя, очевидно, что примерно 70% всех учащихся предполагают - Оператор обычно читается как
mod
или modulo
, а не remainder
. - "C делает это" - что даже не соответствует действительности. 1
- Усечение (например, C ++):
- Делает целочисленное деление более совместимым с IEEE-делением с плавающей запятой (в режиме округления по умолчанию).
- Больше процессоров реализует это.(Может быть неверным в разное время в истории.)
- Оператор читается
modulo
, а не remainder
(даже если на самом деле это аргумент против их точки). - Свойство деления концептуально больше относится к остатку, чем к модулю.
- Оператор читается как
mod
, а не modulo
, поэтому он должен следовать различию Фортрана.(Это может звучать глупо, но, возможно, было решающим аргументом для C99. См. эту тему .)
- "Евклидов" (например, Паскаль -
/
этажи илиусекается в зависимости от знаков, поэтому %
никогда не бывает отрицательным): - Никлаус Вирт утверждал, что никто никогда не удивляется положительным
mod
. - Реймонд Т. Боут позже утверждал, что вы можете 'Евклидово деление наивно реализуется с помощью любого из других правил.
Несколько языков предоставляют оба варианта.Обычно - как в Ada, Modula-2, некоторых Lisps, Haskell и Julia - они используют имена, связанные с mod
для оператора в стиле Python и rem
для оператора в стиле C ++.Но не всегда - например, Фортран называет одни и те же вещи modulo
и mod
(как упоминалось выше для C99).
Мы не знаем, почему Python, Tcl, Perl идругие влиятельные скриптовые языки в основном выбирали напольные покрытия.Как отмечено в вопросе, ответ Гвидо ван Россума только объясняет, почему он должен был выбрать один из трех последовательных ответов, а не почему он выбрал тот, который сделал.
Однако я подозреваю, что влияние C было ключевым.Большинство языков сценариев (по крайней мере на начальном этапе) реализованы в C и заимствуют свой инвентарь операторов из C. Определенная в C89 реализация %
явно не работает и не подходит для «дружественного» языка, такого как Tcl или Python.И С называет оператор "мод".Таким образом, они идут с модулем, а не с остатком.
1.Несмотря на то, что говорится в вопросе - и многие люди используют его в качестве аргумента - C на самом деле не ведет себя так же, как Python и его друзья.С99 требует усеченного деления, а не настила.C89 допускает и то, и другое, а также любую версию мода, так что нет гарантии на свойство подразделения, и нет способа написать переносимый код, делающий целочисленное деление со знаком.Это просто сломано.