我试图以相反的顺序访问存储在向量中的值。以下代码未显示错误:
for (long long int i = 0; i < end.size(); i++)
cout << end[end.size() - 1 - i] << "\n";
但是以下代码显示了运行时错误:
for(long long int i = end.size()-1;i>=0;i--) cout<<end[i]<<"\n";
这两种方法之间有什么区别吗?
这两种方法之间有什么区别吗?
end.size()
返回无符号类型的std::size_t
。给定一个空向量,请从无符号零中减去1。由于使用无符号数的模运算,结果是一个非常大的无符号数。
这里,行为取决于语言的版本以及实现。如果long long
可以表示较大的无符号值,则使用此较大的索引(任何索引超出空向量的边界)会使数组溢出,并且行为将不确定。这可能会在32位系统上发生,其中std::size_t
可能是32位,而又长又长64位。
如果该值不能用long long
表示,则在C ++ 20之前,结果值将由实现定义。如果该值为负,则表示您具有所需的行为,否则就是未定义的行为。在C ++ 20之后,结果将与可表示值的数量乘以可表示值的数量一致。如果long long
的位宽与std::size_t
匹配,则结果将为-1,并且行为将是所需的。
结论:在某些实现中,后期方法被打破了。第一个没有这个问题。
for(auto i=end.size(); i-- ;) cout << end[i] << "\n" ;