Целочисленное деление в C ++ 11 - PullRequest
6 голосов
/ 23 декабря 2011

Я заметил некоторые изменения в формулировке раздела 5.6 для C ++ 11.(Я смотрю на черновой стандарт C ++ N3242 от 2011-02-28.) Новый (черновой) стандарт включает в себя предложение:

"Для целочисленных операндов оператор / дает алгебраический коэффициент с любым дробным дробным числом.часть исключена; "

Это утверждение не содержится в 5.6 стандарта 03 (ISO-IEC-14882-2003), но я не думаю, что это изменение, не так ли?Вот как C и C ++ работали годами, если я не сошел с ума (что могло произойти в любом случае).

Ответы [ 2 ]

9 голосов
/ 23 декабря 2011

Ты не сойдешь с ума.

Сноска к 5.6/4 гласит:

[C++03 footnote 74]: В соответствии с работой, проводимой к пересмотру ISO C, предпочтительный алгоритм для целочисленного деления следует правила, определенные в стандарте ISO Fortran, ISO / IEC 1539: 1991, в котором частное всегда округляется до нуля.

В C ++ 11 это поведение явно требуется, а не является «предпочтительным»; изменение указано в разделе совместимости:

[C++11: C.2.2]:
Изменение: Указать округление для результатов целых чисел / и %
Обоснование: Повышение мобильности, совместимость с C99.
Влияние на исходную функцию: Действительный код C ++ 2003, использующий целочисленное деление округляет результат до 0 или до отрицательной бесконечности, тогда как это Международный стандарт всегда округляет результат до 0.

1 голос
/ 23 декабря 2011

Почти. В C ++ 03 знак остатка для % (в котором были указаны оба термина) не был определен, так как такое округление может уходить от нуля и в определенных ситуациях. Сравните со сноской C ++ 03:

В соответствии с проводимой работой по пересмотру ISO C, предпочтительный алгоритм целочисленного деления следует правилам, определенным в ISO Стандарт Фортрана, ISO / IEC 1539: 1991, в котором частное всегда округляется до нуля.

Однако на практике это почти никогда не имело никакого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...