1 当函数中存在两个return 语句
double Lateral::computecontrol(double x,double y,double err,double speed,double dt){
double ls_factor = ls_factor_(42);
cout<< "ls_factor = "<< ls_factor <<endl;
double target_steer = pid.calculatesteer(x,y);
if (true)
{
double torque = pid.calculate(err,speed,dt);
return torque; //此时函数只会执行第一个return
}
//下面语句将不会被执行
cout<<"init ok"<<endl;
return target_steer; //第二个return 语句不会执行
}
2 return 语句的两种类型
return语句终止当前正在执行的函数并将控制权返回到调用该函数的地方。return语句有两种形式:
return;
return expression;
1、无返回值函数
没有返回值的return语句只能在返回类型是void的函数中。返回void函数不要求非得有return语句,因为这类函数后面会隐含地执行return。
通常情况下,void函数如果想在它中间位置提前退出,可以使用return语句。
一个返回类型是void的函数也能使用return语句的第二种形式,不过此时return语句的expression必须是另一个返回void的函数。
2、有返回值函数
return语句的第二种形式提供了函数的结果。只要函数的返回类型不是void,则该函数内的每条return语句必须返回一个值。return语句返回值的类型必须与函数的返回类型相同,或者能隐式地转换成函数的返回类型。
在含有return语句的循环后面也应该有一条return语句,如果没有的话该程序就是错误的。
补充:
return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。 如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况。
子程序函数返回主调函数,宣告函数的一次执行结束,在调用期间所分配的变量单元被撤消。送函数值到调用表达式中,当然这一点并不是必需的,因为有些函数有返回值,有些函数没有返回值。
void LookupTable::seachIndex(const std::vector<double>&vec,const double x, int &min_id, int &max_id){
int i = 0;
int j = vec.size() - 1;
int mid = 0;
//二分查找法
while (i <= j)
{
mid = (i + j) / 2;
if (x > vec[mid])
{
i = mid + 1;
}
if (x < vec[mid])
{
j = mid - 1;
}
if (x == vec[mid])
{
min_id = mid;
max_id = mid;
std::cout<<" min_id1 "<< min_id <<std::endl;
std::cout<<" max_id1 "<< max_id <<std::endl;
return; //此处,如果满足i<=j,将执行二分法查找到目标索引号后,即退出,不在执行下面语句
}
}
//如果不满足i<=j,则执行下述语句。
std::cout<<" into "<<std::endl;
min_id = std::max(j,0);
max_id = std::min(i,(int)vec.size()- 1);
std::cout<<" min_id2 "<< min_id <<std::endl;
std::cout<<" max_id2 "<< max_id <<std::endl;
}