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在这里的作用是结束函数的运行?
有点疑惑,请大侠指教! 我觉得是跳出for 只要执行到return,就退出函数了,无论这个return在函数里的什么位置,只要执行,就退出 回复【1楼】little Monkey
我觉得是跳出for
-----------------------------------------------------------------------
跳出for是break 回复 【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的哪一个? 跳出所在的那个for
-----
对4楼的回答 回复【4楼】number007cool
-----------------------------------------------------------------------
return结束整个函数吧。。。你这个break结束内层for循环。。。 return 的本意就是函数退出,不管是一般函数还是中断函数,翻译成汇编也就是 ret 或 reti 指令,到底应该执行ret还是reti那是编译器事。
break只跳出离她最近的那层循环。 这个应该是是直接跳出那个子函数的
-------------------------------------
再举一例:
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语句找不到对应的汇编语句 千万不要用return。还不如吧goto搬出来用。或者定义flag然后连续break。
return直接翻译成ret。其实函数最后都有寄存器出栈函数(汇编模式能看到)。return以后会跑偏的。不过控制pc、也可以人工跑偏用来写系统。 直接跳出了函数xxx 回复【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的行为会和很多其它编译器的行为不一致。 弱弱的问一句,在C语言中会不会出现调用函数时出现像汇编语言中出现的目标越界的情况啊?(注:本人不会C语言正在学习- -! 回复【9楼】hzr0071
千万不要用return。还不如吧goto搬出来用。或者定义flag然后连续break。
return直接翻译成ret。其实函数最后都有寄存器出栈函数(汇编模式能看到)。return以后会跑偏的。不过控制pc、也可以人工跑偏用来写系统。
-----------------------------------------------------------------------
。。。。。。。。。。这个,是极个别芯片现象吧
按照一般在C里面,RETURN是函数返回,对应的一返回需要的指令串,不是单单一个RET return是退出当前函数,break是跳出当前循环。 mark 回复【12楼】gprs_new
-----------------------------------------------------------------------
不太可能,编译器会保证的 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语言中也会出现越界的。那都是由于指针越界造成的。就是使用指针的时候一定要注意一下,不要乱指。空间用完就要赶快释放等等问题。 break的作用是跳出所在的循环体。在switch段落中用于结束当前语句段的执行,跳出switch块。
return的作用是结束所在的函数,跳到函数的结束部分,如果有返回值,就带回返回值。
在优化编译条件下,如果编译器能够判断出某些语句是一定不能被执行的,就不会编译。
在某些void函数中return语句不是非写不可的,如果没有return,编译器在编译的时候也会添加return操作。
即使函数是被中断调用的,return也不会惹出麻烦的。 正遇到此类问题,好好看看 mark,解决了我的一个疑惑,谢谢了 学习了——!
return是退出当前函数 跳出函数 hzr0071 发表于 2011-1-1 21:17
千万不要用return。还不如吧goto搬出来用。或者定义flag然后连续break。
return直接翻译成ret。其实函数最 ...
观察过STM8的汇编代码,在ret前会出栈的,我想一般的编译器应该都会处理 退出函数啊,if在哪个函数里面就退出那个函数
return是退出当前函数 进来看看 学习了,原来还有结束函数的语句 常常用,再次复习下 跳出函数了,和面你写的已经没有关系了 跳出主函数! 同样没遇到过跑飞~~! 又涨姿势了~{:lol:}{:lol:}{:lol:}{:lol:} 貌似不会退出吧 return是返回的意思,后面可以带参数,这是个非常通用的语句,绝对不会出现程序跑飞的情况。 这种用法用的比较多,没有发现问题 dr2001 发表于 2011-1-1 21:53
回复【9楼】hzr0071
-----------------------------------------------------------------------
今天早上调程序时发现,当I2C操作失败时,return后程序死掉啦。
编译器中设置的优化等级为Medium。
请教一哈,这可能是什么导致的呢? 个人认为8楼正解。 这样的讨论好。明白的复习一下,不明白的学习一下。支持。 keil下写个代码,然后再运行下,看变量就知道了。 直接跳出函数 3楼正解 就是跳出这个函数啊,,就是符合某个条件了,所以推出该函数,没必要在进行下面的比较了, 个人理解,return字面上就是返回,有调用才有返回,那就是退出这个函数,返回调用函数
如果是break的话就是跳出最近的一个循环。{:lol:}
页:
[1]