背景
在gdb一段代码的时候,发现在执行n的时候,并没有按照预期进行执行,而是运行到另一行代码中。而该行代码是在整体的代码逻辑中由于条件不满足是不可能进入的。
代码框架如下:
if(条件1)
{
处理1
if(条件2)
{
处理2
if(条件3)
{
处理3
if(条件4)
{
return false;
}
处理4
if(条件5)
{
处理5
return true;
}
else
{
//如果执行到这个条件,但是缺失了一个return操作的话,则在n操作的时候跳转到OutErrorMsgFmt("一段信息");下面的return false位置。
//如果这行缺失的话,产生意想不到的出错??
}
std::cout<<"hh"<<std::endl;
}
else
{
return false;
}
}
else
{
if(条件)
{
return true;
}
else
{
return false;
}
}
}
else
{
if(array.size() > 0)
{
if(align)
{
return true;
}
else
{
return false;
}
}
else
{
std::cout<<"2222"<<std::endl;
int flag = -3;
std::cout<<"333"<<std::endl;
OutErrorMsgFmt("一段信息");
return false;//会异常跳转的位置???
}
}
当执行到条件5中的else中时,由于缺失一个return语句,此时如果继续n执行下一步操作的话,会先执行最外层条件1的位置,再到OutErrorMsgFmt(“一段信息”)下面的return false。这里如果在代码最后补充任何的语句,比如std::cout打印任何字符,也不会出现上述奇怪跳转。
这是由于该函数本该有一个返回值,但是程序运行的时候,发现得不到返回值。但是为何会去执行到该行的return false呢?尝试注释掉该行的return false,而在下面又增加一个return 返回值,发现原有的执行,变成新的return值的位置?猜测,是否是在寻找代码块中最末尾的return位置作为替代呢??还望高人指点?
另一个问题:
这就导出一个问题,在一个需要返回值的时候,如果函数实现过程中没有返回值呢?会如何?
下面的测试代码是可以在g++里面正常编译的,系统会给一个返回值。
int testfun(int a)
{
if(a<0)
std::cout<<"a"<<std::endl;
// return true;
else
std::cout<<"b"<<std::endl;
}
void main()
{
int a=10;
// bool b = testfun(a);
std::cout<<testfun(a)<<std::endl;}
按照https://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/Warning-Options.html#Warning-Options
中的说法是会在编译的时候加上-Wreturn-type参数或者-Wall的时候,给出warning信息。
if语句里面的条件判断不是在编译时就可以确定的。程序运行时才知道,是动态联编。
当然,正常情况下,是可以在最后一行return一个值的,在条件中也给予对应的返回值,就不会出现这些异常。