程序导致无限循环

Program causes infinite loop

本文关键字:无限循环 程序      更新时间:2023-10-16

这是有问题的程序。为什么会导致无限循环?

#include <vector>
#include <iostream>
using namespace std;
class Workshop
{
public:
    int pictureFrames( vector<int> pieces );
};
int Workshop::pictureFrames( vector<int> pieces )
{
    int count = 0;
    for ( int i = 0 ; i < pieces.size() - 2 ; i++ )
    {
        for ( int j = i + 1; j < (pieces.size() - 1) ; j++ )
        {
            for ( int k = j + 1; k < (pieces.size()); k++ )
            {
                bool possible = (pieces[i] + pieces[j] > pieces[k]) &&
                                (pieces[j] + pieces[k] > pieces[i]) &&
                                (pieces[k] + pieces[i] > pieces[j]);
                if ( possible )
                    count++;
            }
        }
    }
    return count;
}
void main()
{
    Workshop w;
    vector<int> pieces;
    pieces.push_back( 100 );
    w.pictureFrames( pieces );
}

向量的size()方法返回size_t,这是一个无符号类型。当你取一个值为 1 的无符号类型并从中减去 2 时,你会得到一个非常大的数字。

如果将以下行放在 pictureFrames 方法中,您将观察到为什么循环需要这么长时间才能执行。

cout << pieces.size() - 2 << endl;,

您是否尝试过使用完整诊断进行编译?

看这里: http://coliru.stacked-crooked.com/a/e29de5a6cd9bd21e

main.cpp:15:25: warning: comparison of integers of different signs: 'int' and 'unsigned long' [-Wsign-compare]
for ( int i = 0 ; i < pieces.size() - 2 ; i++ )
                  ~ ^ ~~~~~~~~~~~~~~~~~

[内循环重复两次,对void main()的抱怨]

诊断非常有启发性。

int被提升为unsigned long(或任何size_t(,并与pieces.size() - 2相比,由于模算术,真的很