小编典典

具有负值的模运算符

all

为什么要做这样的操作:

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

给出不同的结果?

-1
1

阅读 75

收藏
2022-07-30

共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) 中

2022-07-30