具有负值的模运算符

为什么做这样的操作:

std::cout << (-7 % 3) << std::endl; std::cout << (7 % -3) << std::endl; 

给出不同的结果?

 -1 1 

从ISO14882:2011(e)5.6-4:

二进制/运算符产生商,二进制%运算符产生第一个expression除以第二个expression式的余数。 如果/或%的第二个操作数为零,则行为是未定义的。 对于积分操作数,运算符产生的代数商与任何小数部分丢弃; 如果商a / b在结果types中可表示,则(a / b)* b + a%b等于a。

其余的是基本的math:

 (-7/3) => -2 -2 * 3 => -6 so a%b => -1 (7/-3) => -2 -2 * -3 => 6 so a%b => 1 

注意

如果两个操作数都是非负的,那么余数是非负的; 如果没有,剩下的符号是实现定义的。

从ISO14882:2003(e)不再存在于ISO14882:2011(e)

这种情况下的符号 (即,当一个或两个操作数是否定的时候)是由实现定义的。 规范在§5.6/ 4(C ++ 03)中说,

二进制/运算符产生商,二进制%运算符产生第一个expression除以第二个expression式的余数。 如果/或%的第二个操作数是零,则行为是未定义的; 否则(a / b)* b + a%b等于a。 如果两个操作数都是非负的,那么余数是非负的; 如果没有,剩下的符号是实现定义的

就C ++ 03而言,这就是所有的语言。

 a % b 

在c ++中默认:

 (-7/3) => -2 -2 * 3 => -6 so a%b => -1 (7/-3) => -2 -2 * -3 => 6 so a%b => 1 

在python中:

 -7 % 3 => 2 7 % -3 => -2 

在C ++到Python:

 (b + (a%b)) % b