提问者:小点点

带向量大小的C++模


#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()有关,但不确定其背后的原因是什么。 提前谢谢你。


共3个答案

匿名用户

在执行除法之前,%的操作数要经过通常的算术转换,以使它们变为公共类型。 如果操作数是intsize_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

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(带向|量|大小|c++|模)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?