gdb时候遇到的奇怪问题(关于返回值)

背景

在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一个值的,在条件中也给予对应的返回值,就不会出现这些异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值