这是有问题的程序。为什么它会导致无限循环?
#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 );
}
答案 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
进行比较,归因于模运算是非常大。