std::vector<int> tmp = ...
for(int i = 0; i <= tmp.size() - 3; i+=2){
std::cout << "i: " << i << " , tmp.size(): " << tmp.size() << std::endl;
if(tmp[i] == tmp[i+1]){
final.push_back(tmp[i] * 2);
}else{
final.push_back(tmp[i]);
final.push_back(tmp[i + 1]);
}
std::cout << "\ntmp.size() at the end of loop: " << tmp.size() << "\n";
}
我有以下输出:
为什么循环执行i
显然比tmp.size()
大得多?
答案 0 :(得分:9)
由于tmp.size()
为1
,从中减去3会产生负值。也就是说,如果tmp.size()
不是size_t
,那么减法会产生负值,而for (size_t i = 0 ; i+3 <= tmp.size() ; i += 2) {
...
}
是无符号的。{/ p>
当无符号即将减去负数时,它会“包围”到一个非常大的值。这就是你的循环无法停止的原因。它还解释了编译器 * 产生的“签名到无符号比较”警告,它应该让你处于高度警戒状态。
要避免此问题,请将减法移至另一侧,并将其添加:
stickyTracking: false,
* 如果您没有收到该警告,请更改编译器上的设置以警告您所有内容。这节省了大量时间用于调试编译器可以轻松检测到的许多常见问题。
答案 1 :(得分:2)
因为tmp.size()
循环中for
仅为1,所以
for(int i = 0; i <= tmp.size() - 3; i+=2) { /* ... */ }
tmp.size() - 3
变为负数,但是使用无符号类型,因此数字很大。这就是为什么你的i
不会停止增加,即使它非常大。