首页 > 解决方案 > 为什么我有一个无限循环?简单的问题,简短的代码

问题描述

如果输入数组是空的,那么array.size()应该是 0。第一个for,从0to array.size() - 1,应该意味着它从0to -1,对吧?

for然后,不应输入此值,并且该函数应返回 inversionsCounter 值,该值将是0

但这并没有发生,代码进入了一个无限循环。为什么是这样?

这是代码:

#include <vector>
#include <iostream>

using namespace std;

int countInversions(vector<int> array)
{    
    int inversionsCounter = 0;
    for (int i = 0; i < array.size() - 1; ++i)
        for (int j = i + 1; j < array.size(); ++j)
            if (array[i] > array[j])
                ++inversionsCounter;

    return inversionsCounter;
}

int main()
{
    vector<int> array = {};
    cout << array.size();
    cout << countInversions(array);
}

标签: c++for-loopvectorinfinite-loopimplicit-conversion

解决方案


size类模板的成员函数返回值的std::vector类型是无符号整数类型,通常等价于类型size_t

所以在for循环的条件下

for (int i = 0; i < array.size() - 1; ++i)

由于通常的算术转换,表达式的两个操作数

i < array.size() - 1

被转换为与 type 对应的无符号整数类型std::vector<int>::size_type。因此,当成员函数返回 0时,表达式array.size() - 1将转换为该类型的最大值。size

这是一个演示程序。

#include <iostream>
#include <iomanip>

int main() 
{
    std::cout << size_t( -1 ) << '\n';
    std::cout << std::boolalpha << ( 0 < size_t( -1 ) ) << '\n';    
    
    return 0;
}

它的输出是

18446744073709551615
true

所以当成员函数size返回 0 你实际上有一个像这样的循环

for (int i = 0; i < 18446744073709551615; ++i)

而不是类型int,您应该至少使用size_t索引类型。外循环应该看起来像

for ( size_t i = 0; i < array.size(); ++i )

推荐阅读