为什么要做这样的操作:
std::cout << (-7 % 3) << std::endl; std::cout << (7 % -3) << std::endl;
给出不同的结果?
-1 1
来自 ISO14882:2011(e) 5.6-4:
二元 / 运算符产生商,二元 % 运算符产生第一个表达式除以第二个表达式的余数。如果 / 或 % 的第二个操作数为零,则行为未定义。对于整数操作数, / 运算符产生代数商,其中任何小数部分被丢弃;如果商 a/b 在结果的类型中是可表示的,则 (a/b)*b + a%b 等于 a。
剩下的就是基础数学:
(-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) 中