языковой адвокат — оператор C ++,% гарантии

Гарантируется ли это, что (-x) % m, где x а также m позитивны в с ++ стандарт (c ++ 0x) отрицательно и равно -(x % m)?

Я знаю, что это правильно на всех машинах, которые я знаю.

20

Решение

В дополнение к LuchianОтвет, это соответствующая часть из стандарта C ++ 11:

Двоичный / оператор дает частное, а двоичный оператор%
дает остаток от деления первого выражения на
второй. Если второй операнд / или% равен нулю, поведение
не определено. Для интегральных операндов оператор / дает алгебраический
частное с любой дробной частью отбрасывается; если частное а / б
представляемый в типе результата, (a / b) * b + a% b равен a.

Который пропускает последнее предложение. Итак, часть

(a / b) * b + a% b равно a

Это единственная ссылка, на которую можно положиться, и это означает, что a % b всегда будет иметь знак a, учитывая усеченное поведение /, Таким образом, если ваша реализация придерживается стандарта C ++ 11 в этом отношении, знак и значение операции по модулю действительно идеально определены для отрицательных операндов.

11

Другие решения

5.6 Мультипликативные операторы

4) Бинарный / оператор дает частное, а бинарный%
Оператор дает остаток от деления первого
Выражение вторым. Если второй операнд / или% равен нулю,
поведение не определено; в противном случае (a / b) * b + a% b равно a. Если
оба операнда неотрицательны, тогда как остаток неотрицателен; если
нет, знак остатка определяется реализацией
(акцент мой)

Это из C ++ 03, хотя. 🙁

7

По вопросам рекламы [email protected]