#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<int> v = {1, 2, 3, 4, 5, 6, 7};
int i = -4;
cout << i << endl;
cout << v.size() << endl;
cout << i % v.size() << endl;
cout << -4 % 7 << endl;
}
上面的代码打印:
-4
7
5
-4
有人能解释一下为什么i%v.size()
打印5
而不是-4
吗? 我猜它与vector.size()
有关,但不确定其背后的原因是什么。 提前谢谢你。
在执行除法之前,%
的操作数要经过通常的算术转换,以使它们变为公共类型。 如果操作数是int
和size_t
,则将int
转换为size_t
。
如果size_t
是32位的,则-4
将变成4294967292
,则表达式的结果是4294957292%7
,实际上是0
。
如果size_t
是64位的,则-4
将变为18,446,744,073,709,551,612,此%7
的结果是您看到的5
。
因此,实际上我们可以从这个输出中看出,您的系统具有64位的size_t。
从C++11开始,模数运算符定义为:
(a/b)*b + a%b == a
所以定义它与整数除法一致。 所以一切都是很好的定义,即使是负数。
但是,在您的情况下,您有一个有符号/无符号的除法(因为。size()返回无符号),并且适用通常的有符号/无符号规则。 这意味着在执行操作之前,所有参数都转换为无符号。
把-4转换成无符号(并且变成一个非常大的数),然后进行模运算。
你也可以看到,5不是一个正确的答案-4模7的任何定义的整数除法(3将是正确的)。
C和C++的算术规则并不直观。
因为v.size
返回size_t
。
cout << -4 % size_t(7) << endl; // 5
看一看带负值的模运算符
Upd:和signed-int-modulo-unsigned-int-products-nonsense-results