为什么这两个函数的行为不同
Why these two functions does not behave the same
对于空向量,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 < st
是i < -1
,这是偶然起作用的。但是,在第二个函数中,i < st
实际上是i < <some ultra big value>
,哈哈。
相关文章:
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 两个父类的构造函数的序列
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- C++如果两个模板函数都与参数列表匹配,将调用哪个模板
- 如何从两个不同的函数传递参数
- 两个函数模板候选项.将一个参数作为引用后,选择不太专业的模板
- 如何比较两个函数的速度和性能
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 有一个构造函数,但有两个析构函数
- 为什么系统日志有两个不同的函数声明?
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- C++ 关于两个类构造函数的问题
- 如何创建两个具有相同名称和不同返回类型并基于布尔参数运行的函数
- 如何在构造器的成员初始值设定项列表中调用两个函数?
- 如何将这两个函数组合成一个实现?
- 将函数两个向量合并为第三个向量
- C++朋友函数两个数字的加法