ejemplos - c++ online
Operador de módulo con valores negativos (3)
De ISO14882: 2011 (e) 5.6-4:
El operador binario produce el cociente, y el operador binario% produce el resto de la división de la primera expresión por el segundo. Si el segundo operando de / o% es cero, el comportamiento no está definido. Para operandos integrales, el operador / produce el cociente algebraico con cualquier parte fraccional descartada; si el cociente a / b es representable en el tipo de resultado, (a / b) * b + a% b es igual a a.
El resto es matemática básica:
(-7/3) => -2
-2 * 3 => -6
so a%b => -1
(7/-3) => -2
-2 * -3 => 6
so a%b => 1
Tenga en cuenta que
Si ambos operandos son no negativos, el resto no es negativo; si no, el signo del resto está definido por la implementación.
de ISO14882: 2003 (e) ya no está presente en ISO14882: 2011 (e)
Por qué hacer tales operaciones:
std::cout << (-7 % 3) << std::endl;
std::cout << (7 % -3) << std::endl;
dar diferentes resultados?
-1
1
El signo en tales casos (es decir, cuando uno o ambos operandos son negativos) está definido por la implementación. La especificación dice en §5.6 / 4 (C ++ 03),
El operador binario produce el cociente, y el operador binario% produce el resto de la división de la primera expresión por el segundo. Si el segundo operando de / o% es cero, el comportamiento no está definido; de lo contrario (a / b) * b + a% b es igual a a. Si ambos operandos son no negativos, el resto no es negativo; si no, el signo del resto está definido por la implementación .
Eso es todo lo que el lenguaje tiene que decir, en lo que se refiere a C ++ 03.
a % b
en c ++ por defecto:
(-7/3) => -2
-2 * 3 => -6
so a%b => -1
(7/-3) => -2
-2 * -3 => 6
so a%b => 1
en python:
-7 % 3 => 2
7 % -3 => -2
en c ++ a python:
(b + (a%b)) % b