【问题标题】:Why do I have an infinite loop? Simple question, short code为什么我有一个无限循环?简单的问题,简短的代码
【发布时间】:2021-09-09 12:08:52
【问题描述】:

如果输入数组为空,则array.size() 应为0。第一个for,从0array.size() - 1,应该意味着它从0-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);
}

【问题讨论】:

  • 我相信array.size() - 1 溢出了。
  • 首先解决 : C4018: '
  • 请发布导致问题的实际代码。在您发布的代码中,您根本没有调用函数countInversions
  • 循环在技术上并不是无限的——但它会运行一段时间。 array 的大小为零,因此 array.size() - 1 将产生 std::size_t 可以表示的最大值,这通常(取决于您的编译器和主机系统)相当大的值(例如 4294967295 在 32 位system 或 18,446,744,073,709,551,615 在 64 位系统上)。
  • @maverick.01:通常,您发布的代码应该能够重现该问题。为了重现问题,您的问题的读者不必考虑代码的哪些部分必须取消注释,哪些部分不需要。注释代码的第一部分必须保持停用状态并不是很明显,但注释代码的第二部分必须通过取消注释重新激活。这使您的问题更难理解。同时,其他人编辑了您的问题以解决此问题。

标签: c++ for-loop vector infinite-loop implicit-conversion


【解决方案1】:

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

所以在for循环的条件下

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

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

i < array.size() - 1

被转换为与std::vector&lt;int&gt;::size_type 类型对应的无符号整数类型。结果表达式array.size() - 1在成员函数size返回0时转换为该类型的最大值。

这是一个演示程序。

#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)

您应该至少使用size_t 类型而不是int 类型作为索引。外循环应该是这样的

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

【讨论】:

    【解决方案2】:

    vector 上 size() 方法的返回类型是 size_t,一个无符号整数值 - 通常只是 unsigned int。这种类型,size_t,是无符号,不能携带负数。在大多数情况下,编译器会对此发出警告。

    然而,当需要执行代码时,编译器会将 signed 整数 -1(从 size() - 1 计算)的“反码”形式替换为 size_t (无符号)类型。

    当试图将其表示为 un 有符号数时,这个 -1 有符号数通常非常大。这里的大部分细节取决于您的特定机器和编译器细节。

    这意味着你的外部 for 循环 for (int i = 0; i &lt; array.size() - 1; ++i) 不是在无限循环中运行,而是一个很长的循环。

    【讨论】:

      【解决方案3】:

      将 array.size() 转换为 int 否则类似于 ...

      (int)array.size()
      

      【讨论】:

        猜你喜欢
        • 2013-09-29
        • 2013-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多