程序导致无限循环

时间:2014-10-20 22:57:08

标签: c++ stl

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

您是否尝试使用完整诊断程序对其进行编译?

见这里: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进行比较,归因于模运算非常大