具有负值的模运算符
为什么做这样的操作:
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