为什么这两个函数的行为不同

时间:2019-01-26 21:17:05

标签: c++

对于空向量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;
}

1 个答案:

答案 0 :(得分:0)

由于service_times是一个空向量,service_times.size()应该返回0,不是吗?

否。返回size_t(0),这是无符号类型。因此,service_times.size() - 1unsigned - signed操作,其中signed值(1)被“提升”为unsigned类型。因此,0 - 1实际上是numeric_limits<size_t>::max()

在第一个函数中,您通过将其再次存储在int变量中来保存它:它再次变为-1。因此,i < sti < -1,它偶然起作用。但是,在第二个函数中,i < st实际上是i < <some ultra big value>,大声笑。