为什么 for 循环没有停止?

Din*_*har 1 c++ for-loop vector

for我的程序中有一个没有停止的循环:

vector<int> v;
int k = 1;
v.push_back(1);

for(int i=v.size()-1; i>=(v.size()-k); i--){
    cout << i << " " << v.size() - k << endl;
}
Run Code Online (Sandbox Code Playgroud)

当我执行上述程序时,它一直在for循环内运行。for循环的输出如下:

0 0
-1 0
-2 0
-3 0
-4 0
.
.
.
Run Code Online (Sandbox Code Playgroud)

根据输出,值i递减,值为v.size()-k0。所以,i >= v.size()-k为假,应该for在第一轮后停止循环执行,但for循环不会停止执行。

有人可以帮我理解这个问题吗?

Dav*_*rtz 6

您正在检查是否i大于或等于零。但是由于size()返回一个无符号,您正在与i一个无符号零进行比较。为了进行比较,i被转换为size()返回的相同无符号类型。好吧,每个无符号整数值都大于或等于零。因此,无论值i具有什么,比较都是正确的。

size()函数必须返回一个足够大的类型,以容纳向量中可能存在的最大条目数。这可能大于一个int可以容纳的最大值。在典型的现代平台上,int可能是 32 位有符号类型,而size()返回 64 位无符号类型。

这是来自我的编译器的警告:

a.cpp: In function ‘int main()’:
a.cpp:10:28: warning: comparison of integer expressions of different signedness:
             ‘int’ and ‘std::vector<int>::size_type’
             {aka ‘long unsigned int’} [-Wsign-compare]
   10 |     for(int i=v.size()-1; i>=(v.size()-k); i--){
      |                           ~^~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

  • @rturrado它可能不完全是“无符号”,而是某种无符号类型。也许 `unsigned long` 或任何 `std::size_type` 在他的平台上计算结果。 (3认同)
  • 所以这里的关键点是 `i&gt;=(v.size()-k)` 可以被看作 `unsigned::operator&gt;=((unsigned) i, (unsigned) 0)`,对吧?这解释了 _`i` 被转换为你提到的 unsigned_ 。 (2认同)
  • @rturrado如果发生这种情况,如果向量中的项目数大于有符号整数可以容纳的最大值,则比较将得到错误的结果。考虑 64 位平台上具有 32 位整数的 bool 向量。您无法回避程序员在进行比较时考虑类型的需要。(您也许可以让编译器向您发出有关混合有符号/无符号的警告,您应该注意它!) (2认同)