C语言中,if语句后面加return 的用法的疑问。

2020-01-21 21:34发布

有这么一段代码:
void xxx()
{
    if(rs_buf[0]=='$')
    {
        for(i=0;i<sizeof(GPS_GPRMC)-1;i++)
        {
            j=getuartdat();
            if(j<256)
            {
                rs_buf=(alt_u16)j;
                if(rs_buf!=GPS_GPRMC)
                return;
            }
        }
    }
}
当这句话成立: if(rs_buf!=GPS_GPRMC)
                return;

即return执行后,程序再怎样运行,是不是直接跳出了函数xxx,即return在这里的作用是结束函数的运行?
有点疑惑,请大侠指教!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
44条回答
ufbycd
1楼-- · 2020-01-23 01:03
return 的本意就是函数退出,不管是一般函数还是中断函数,翻译成汇编也就是 ret 或 reti 指令,到底应该执行ret还是reti那是编译器事。
break只跳出离她最近的那层循环。
tcp1985
2楼-- · 2020-01-23 01:18
这个应该是是直接跳出那个子函数的
-------------------------------------
再举一例:

void XXX()
{
   程序代码分段1
   return;
   程序代码分段2  
}
说明:这样子的话编译器是不对分段2进行编译的。。。

测试实例:


Keil的测试实例 (原文件名:Keil的测试实例.jpg)

实例说明:编译器是KEIL的,编译条件都是默认的。

        for(i=0;i<8;i++)
         {
             P1=i;
         }
//这个for语句找不到对应的汇编语句
hzr0071
3楼-- · 2020-01-23 02:55
千万不要用return。还不如吧goto搬出来用。或者定义flag然后连续break。
return直接翻译成ret。其实函数最后都有寄存器出栈函数(汇编模式能看到)。return以后会跑偏的。不过控制pc、也可以人工跑偏用来写系统。
yunqian09
4楼-- · 2020-01-23 08:04
 精彩回答 2  元偷偷看……
dr2001
5楼-- · 2020-01-23 08:58
回复【9楼】hzr0071  
-----------------------------------------------------------------------

不太清楚这里的说法出处如何,如果有出处,还请举例指明。

Return是C语言标准中规定的句法,有明确的行为。除非使用的编译器的行为不符合C语言标准(这个基本不会)。
Return在函数中是可以随意使用的,作用是结束当前所在函数的执行并返回。(特殊的中断处理函数是编译器扩展,不是C标准的函数,编译器会扩展对应的中断相关指令)
使用Return就是正常的结束函数,无毒副作用。、
如果说为了不用Return而把Goto搬出来,就不对了。Goto比较典型的用法之一,是类似uIP那样,函数调用扁平化,省内存,或者跳出N长循环,etc。

Return在编译器的不用优化级以及函数调用方式下,会翻译成不同的指令序列。
暂未听说过Return还会跑偏的实例,此处是首次听说。


回复【7楼】ufbycd  
-----------------------------------------------------------------------

Return会编译成退出函数的指令序列。可能是N多指令。
通常会遵循调用约定清理现场,调整堆栈,etc,然后返回。

最好不要拿51说话。51堆栈太小,动态变量在Keil是用Call Graph静态分配的,如果加了reentrant才是放在堆栈的。所以51上return的行为会和很多其它编译器的行为不一致。
gprs_new
6楼-- · 2020-01-23 11:43
弱弱的问一句,在C语言中会不会出现调用函数时出现像汇编语言中出现的目标越界的情况啊?(注:本人不会C语言正在学习- -!

一周热门 更多>