从反向顺序C++访问矢量时运行时出错



我试图以相反的顺序访问存储在向量中的值。以下代码未显示错误:

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" ;

最新更新