对于空向量Fun1返回0。应与Fun1等效的函数Fun2(只有一个小小的变化,请参见下文),由于错误向量下标超出范围而崩溃。有什么想法吗? 在Visual Studio 2017中运行的代码
int Fun1(vector<int> service_times) {
sort(service_times.begin(), service_times.end());
int sum = 0;
int sumi = 0;
int st = service_times.size() - 1;//condition stired in variable
for (int i = 0; i < st; i++)
{
sumi += service_times[i];
sum = sum + sumi;
}
return sum;
}
int Fun2(vector<int> service_times) {
sort(service_times.begin(), service_times.end());
int sum = 0;
int sumi = 0;
for (int i = 0; i < (service_times.size() - 1); i++)//condition
//directly written
{
sumi += service_times[i];
sum = sum + sumi;
}
return sum;
}
答案 0 :(得分:0)
由于service_times
是一个空向量,service_times.size()
应该返回0
,不是吗?
否。返回size_t(0)
,这是无符号类型。因此,service_times.size() - 1
是unsigned - signed
操作,其中signed
值(1
)被“提升”为unsigned
类型。因此,0 - 1
实际上是numeric_limits<size_t>::max()
。
在第一个函数中,您通过将其再次存储在int
变量中来保存它:它再次变为-1
。因此,i < st
是i < -1
,它偶然起作用。但是,在第二个函数中,i < st
实际上是i < <some ultra big value>
,大声笑。