这个for循环总是立即崩溃:
for (auto i = v.size() - 1; i >=0; --i);
显然我在循环中有一整堆代码,而v是双精度矢量。我试图以相反的顺序迭代它们。
这里发生了什么?
答案 0 :(得分:5)
for (auto i = v.size() - 1; i >=0; --i);
查看vector :: size()方法 - 它通常返回 unsigned int (在奇怪的平台上,它可能是其他无符号类型)!因此,您的i
变量将具有无符号类型。
当你的循环进入步骤i == 0
时,它将减少它,i
将具有值2^32 - 1 == UNSIGNED_INT_MAX
(或者如果你在奇怪的平台上工作,则为其他正值 - 请参阅vector :: size_type在您的平台上查看底层类型)。所以它永远不会小于0,它永远不会停止你的循环。我想当它变得如此之大以至于因为它超出范围而崩溃,但我没有看到完整的代码。
请参阅here - 查找size_type
typedef - 它表示无符号类型。
你可能想要使用反向迭代器(参见@ NathanOliver' s),尽管我不是很喜欢它们在简单的循环中。
答案 1 :(得分:3)
由于i
是无符号的,因此它永远不会小于0.它会回绕到它可以容纳的最大值。
如果要向后迭代向量,则应使用reverse_iterator
std::vector<int> foo = {1,2,3,4,5,6,7,8,9};
for (auto it = foo.rbegin(); it != foo.rend(); ++it)
std::cout << *it << " ";
这将输出
9 8 7 6 5 4 3 2 1
答案 2 :(得分:2)
变量i将是无符号类型。
永远不会少于零。
最终你将访问向量之外的元素,因为我将回绕到最大可能的无符号值而不是去负数
答案 3 :(得分:1)
芭丝谢芭说:汽车类型是无符号的。因此递减0变为一些大的正数,即> = 0因此循环继续,但该值超出了向量的范围并导致崩溃。