模运算符(%)给出不同的结果
Modulo Operator (%) gives divergent results
给定此示例:
std::vector<int> numbers = {5,6,7}; //size is 3
int i = -1;
std::cout << i % 3 <<"n"; // output: -1
std::cout << i % numbers.size() << "n"; // output: 0
基本上在两个语句中im处理-1%3,但编译器输出不同的数字。我不明白这个结果,也许有人可以向我解释。
编辑:作为@Chris,@Keith Thompson@AnT建议使用片段
std::cout << std::numeric_limits<std::size_t>::max() % 3 <<"n"; //output: 0
std::cout << i % numbers.size() << "n"; // output: 0
打印预期输出。谢谢你给大家的有益建议!
i % 3
是您所期望的,并且自C++11以来,它定义了语义,而不是定义了实现(如果我记得正确的话)结果。
numbers.size()
具有无符号类型(std::size_t
)。假设size_t
与int
一样大或更大,则在执行操作之前,i
被转换为相同的无符号类型。i
得到的值将是该类型的最大值,它看起来可以被3整除。
问题是在C++中没有定义负数的%。
相关文章:
- 使用++运算符会导致意外的结果
- 三元运算符在返回语句中给出意外的结果
- oStream 不打印添加两个 valarray 的结果(使用运算符重载)
- 当关系运算符的含义相同时,为什么结果不同?
- 有没有办法将 for 循环结果返回到像三元运算符这样的函数中?
- C++:比较运算符>和字符串文本的意外结果
- 为什么 == 运算符没有产生与 strcmp 相同的结果?
- 具有预分配结果C++的重载加运算符
- 使用 C++ 中的运算符重载显示不正确的结果
- 为什么当我使用额外的括号而不使用运算符重载时,插入运算符在 std::cout 中给出不同的结果?
- 为什么这个条件运算符的计算结果为 int?
- 为什么>>运算符在不同的编译器上显示不同的结果?
- 运算符的两个不同结果 - 在 c++11 中
- C++ 中的增量运算符未获得正确的结果
- 为什么在std :: string上尺寸运算符会产生意外结果
- 重载前增量运算符使用重载后增量运算符内的变量结果
- C++运算符和带枚举的计算结果为 false
- sizeof(…)运算符结果的使用令人困惑
- 根据运算符推断模板返回类型:结果
- 运算符*=来自两个实例(矩阵),结果不好