number007cool 发表于 2011-1-1 19:48:53

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

有这么一段代码:
void xxx()
{
    if(rs_buf=='$')
    {
      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在这里的作用是结束函数的运行?
有点疑惑,请大侠指教!

little_Monkey 发表于 2011-1-1 19:53:33

我觉得是跳出for

luo496724812 发表于 2011-1-1 19:53:37

只要执行到return,就退出函数了,无论这个return在函数里的什么位置,只要执行,就退出

luo496724812 发表于 2011-1-1 19:54:10

回复【1楼】little Monkey
我觉得是跳出for
-----------------------------------------------------------------------

跳出for是break

number007cool 发表于 2011-1-1 19:59:02

回复 【2楼】 luo496724812
-------------------------------
假如加入这个xxx函数是中断服务子函数呢,也一样跳出么?

回复 【3楼】 luo496724812
------------------------------------------------------------
假如代码如下:
void xxx()
{
    for(k=0;k<100;k++)
    {
      for(i=0;i<sizeof(GPS_GPRMC)-1;i++)
      {
            j=getuartdat();
            if(j<256)
            {
                rs_buf=(alt_u16)j;
                if(rs_buf!=GPS_GPRMC)
                break;
            }
      }
    }
}
当break执行后,程序会怎样执行?这个break是break的哪一个?

kinoko 发表于 2011-1-1 20:01:30

跳出所在的那个for

-----

对4楼的回答

myqiang1990 发表于 2011-1-1 20:02:25

回复【4楼】number007cool
-----------------------------------------------------------------------
return结束整个函数吧。。。你这个break结束内层for循环。。。

ufbycd 发表于 2011-1-1 20:07:13

return 的本意就是函数退出,不管是一般函数还是中断函数,翻译成汇编也就是 ret 或 reti 指令,到底应该执行ret还是reti那是编译器事。
break只跳出离她最近的那层循环。

tcp1985 发表于 2011-1-1 21:01:44

这个应该是是直接跳出那个子函数的
-------------------------------------
再举一例:

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

测试实例:

http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_608459SYHFBP.jpg
Keil的测试实例 (原文件名:Keil的测试实例.jpg)

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

        for(i=0;i<8;i++)
       {
             P1=i;
       }
//这个for语句找不到对应的汇编语句

hzr0071 发表于 2011-1-1 21:17:11

千万不要用return。还不如吧goto搬出来用。或者定义flag然后连续break。
return直接翻译成ret。其实函数最后都有寄存器出栈函数(汇编模式能看到)。return以后会跑偏的。不过控制pc、也可以人工跑偏用来写系统。

yunqian09 发表于 2011-1-1 21:37:36

直接跳出了函数xxx

dr2001 发表于 2011-1-1 21:53:16

回复【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 发表于 2011-1-1 21:57:59

弱弱的问一句,在C语言中会不会出现调用函数时出现像汇编语言中出现的目标越界的情况啊?(注:本人不会C语言正在学习- -!

380121850 发表于 2011-1-1 23:23:47

回复【9楼】hzr0071
千万不要用return。还不如吧goto搬出来用。或者定义flag然后连续break。
return直接翻译成ret。其实函数最后都有寄存器出栈函数(汇编模式能看到)。return以后会跑偏的。不过控制pc、也可以人工跑偏用来写系统。
-----------------------------------------------------------------------

。。。。。。。。。。这个,是极个别芯片现象吧

按照一般在C里面,RETURN是函数返回,对应的一返回需要的指令串,不是单单一个RET

cumtgao 发表于 2011-1-19 14:51:48

return是退出当前函数,break是跳出当前循环。

muzheyun 发表于 2011-1-21 08:27:24

mark

zengxy 发表于 2011-1-21 08:51:05

回复【12楼】gprs_new
-----------------------------------------------------------------------

不太可能,编译器会保证的

ddwl99 发表于 2011-1-21 09:23:59

return是跳出函数
就是释放堆栈中的内容。所有函数内建立的临时变量所占的地址都会没有。

break是跳出最近的一个循环

continue是继续下一个循环

例如
void fun1(void)
{
    int tmp = 0;
    for(; tmp < 20; tmp++)
    {
      i++;
      if(i > 10)
      {
            return;
         }
      
   }
}
这里面就是这个函数执行完,i应该等于11,前提是假设i为全局变量,从零开始

void fun2(void)
{
    int m = 0;
    int n = 0;

   for(;m < 5;m++)
    {
         while(n++ < 5)
         {
            if(i <= 0)
            {
                  break;//进入这个if的时候,就意味着内层循环要结束了,进行下一个for循环,不会执行要下句话
               }
               i--;
          }
      n = 0;
   }
}
前提是i为全局变量。
void fun3(void)
{
   int m = 0;
    int n = 0;

   for(;m < 5;m++)
    {
         while(n++ < 5)
         {
            if(i <= 0)
            {
                  continue;//进入这个if的时候,就意味着本次循环要结束了,进行下一次的while循环
               }
               i--;
          }
      n = 0;
   }

}
这个函数跟fun2基本一样,只是把break换成了continue。
其实fun3内的while函数的执行过程就是while(n++ < 5){if(i > 0){i--;}}.

例子举的有点不太恰当,呵呵。意思就这个意思。

其实最好不要乱使用GOTO语句。
另外回复12楼,C语言中也会出现越界的。那都是由于指针越界造成的。就是使用指针的时候一定要注意一下,不要乱指。空间用完就要赶快释放等等问题。

hunter0395 发表于 2011-1-21 09:34:18

break的作用是跳出所在的循环体。在switch段落中用于结束当前语句段的执行,跳出switch块。
return的作用是结束所在的函数,跳到函数的结束部分,如果有返回值,就带回返回值。
在优化编译条件下,如果编译器能够判断出某些语句是一定不能被执行的,就不会编译。
在某些void函数中return语句不是非写不可的,如果没有return,编译器在编译的时候也会添加return操作。
即使函数是被中断调用的,return也不会惹出麻烦的。

mvip 发表于 2012-4-5 20:49:11

正遇到此类问题,好好看看

NEXEN1106 发表于 2014-9-12 16:01:02

mark,解决了我的一个疑惑,谢谢了

l769109884 发表于 2014-9-13 08:55:44

学习了——!

ruanxianwu 发表于 2014-9-13 09:10:34


return是退出当前函数

别有洞天下 发表于 2014-9-13 09:34:47

跳出函数

blueagle2012 发表于 2014-9-13 11:53:42

hzr0071 发表于 2011-1-1 21:17
千万不要用return。还不如吧goto搬出来用。或者定义flag然后连续break。
return直接翻译成ret。其实函数最 ...

观察过STM8的汇编代码,在ret前会出栈的,我想一般的编译器应该都会处理

苦行僧 发表于 2014-9-13 11:54:43

退出函数啊,if在哪个函数里面就退出那个函数

ruanxianwu 发表于 2014-9-13 12:00:19



return是退出当前函数

大风起兮 发表于 2014-9-13 12:07:19

进来看看

benli 发表于 2014-9-13 13:16:45

学习了,原来还有结束函数的语句

chliken 发表于 2014-9-13 13:27:57

常常用,再次复习下

hyg5200aaa 发表于 2014-9-13 13:29:21

跳出函数了,和面你写的已经没有关系了

59libin 发表于 2014-9-13 13:38:32

跳出主函数! 同样没遇到过跑飞~~!

lcl 发表于 2014-9-13 13:49:44

又涨姿势了~{:lol:}{:lol:}{:lol:}{:lol:}

cs128815 发表于 2014-9-13 14:01:22

貌似不会退出吧

zhwm3064 发表于 2014-9-13 14:51:01

return是返回的意思,后面可以带参数,这是个非常通用的语句,绝对不会出现程序跑飞的情况。

_laoy 发表于 2014-9-13 15:01:26

这种用法用的比较多,没有发现问题

crazydtone 发表于 2014-12-19 17:19:26

dr2001 发表于 2011-1-1 21:53
回复【9楼】hzr0071
-----------------------------------------------------------------------



今天早上调程序时发现,当I2C操作失败时,return后程序死掉啦。
编译器中设置的优化等级为Medium。

请教一哈,这可能是什么导致的呢?

liyang121316 发表于 2014-12-19 17:42:42

个人认为8楼正解。

mybigapple 发表于 2014-12-19 19:59:09

这样的讨论好。明白的复习一下,不明白的学习一下。支持。

xrydt 发表于 2014-12-20 08:12:24

keil下写个代码,然后再运行下,看变量就知道了。

LiuYH 发表于 2014-12-20 09:20:46

直接跳出函数

minier 发表于 2014-12-20 11:16:39

3楼正解

craigtao 发表于 2014-12-20 23:12:37

就是跳出这个函数啊,,就是符合某个条件了,所以推出该函数,没必要在进行下面的比较了,

blavy 发表于 2014-12-20 23:32:52

个人理解,return字面上就是返回,有调用才有返回,那就是退出这个函数,返回调用函数
如果是break的话就是跳出最近的一个循环。{:lol:}
页: [1]
查看完整版本: C语言中,if语句后面加return 的用法的疑问。