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

Why these two functions does not behave the same

本文关键字:函数 两个 为什么      更新时间:2023-10-16

对于空向量,Fun1 返回 0。函数 Fun2,应该等效于 Fun1(只有一个小的变化,见下文),崩溃时错误向量下标超出范围。任何想法为什么会这样?在 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;
}

由于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 < sti < -1,这是偶然起作用的。但是,在第二个函数中,i < st实际上是i < <some ultra big value>,哈哈。