为什么这样的操作:
std::cout << (-7 % 3) << std::endl;
std::cout << (7 % -3) << std::endl;
Run Code Online (Sandbox Code Playgroud)
给出不同的结果?
-1
1
Run Code Online (Sandbox Code Playgroud)
Pla*_*aHH 187
来自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
Run Code Online (Sandbox Code Playgroud)
注意
如果两个操作数都是非负的,那么余数是非负的; 如果没有,余数的符号是实现定义的.
ISO14882:2003(e)中不再出现ISO14882:2011(e)
Naw*_*waz 19
这种情况下的符号(即当一个或两个操作数为负时)是实现定义的.该规范在§5.6/ 4(C++ 03)中说,
二元/运算符产生商,二元%运算符从第一个表达式除以第二个表达式得到余数.如果/或%的第二个操作数为零,则行为未定义; 否则(a/b)*b + a%b等于a.如果两个操作数都是非负的,那么余数是非负的; 如果没有,余数的符号是实现定义的.
就C++ 03而言,这就是所有语言所必须说的.
Kto*_* To 19
a % b
Run Code Online (Sandbox Code Playgroud)
在c ++中默认:
(-7/3) => -2
-2 * 3 => -6
so a%b => -1
(7/-3) => -2
-2 * -3 => 6
so a%b => 1
Run Code Online (Sandbox Code Playgroud)
在python中:
-7 % 3 => 2
7 % -3 => -2
Run Code Online (Sandbox Code Playgroud)
在c ++到python中:
(b + (a%b)) % b
Run Code Online (Sandbox Code Playgroud)