0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

哪些场景下需要显式的对void函数添加return语句呢?

GReq_mcu168 来源:玩转单片机 作者:玩转单片机 2020-06-24 11:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

return是啥return其英文含义就是返回,用在函数中,退出当前函数。这个想必都知道,分两种情况:

函数不带返回值时,如

void func(void)

/*功能代码*/

return;

对于不带返回值函数返回,其语法为 return;对于void函数,通常不显式加return语句,程序会自动返回到其调用者现场。

所以上述函数如下改写一下,效果是一样的:

void func(void)

/*功能代码*/

函数带返回值,如

int add(int a, int b)

int result = a+b;

return result;

对于带返回值函数返回,其语法为 return 《value》;返回值可以是一些几种情况:

一个常数

一个变量

计算式,例如(a + b)* c

调用另一个返回值的函数

注意:返回值的类型须与函数返回值类型一致,如不一致,编译器会自动做类型转换,这里容易出现类型转换的错误

上代码:

/*Case 1,返回常量*/

/*返回常量,-1表示参数非法,0表示成功*/

int swap(int *a, int *b)

int temp;

if(a==NULL || b==NULL)

return -1;

else

temp = *a;

*a = *b;

*b = temp;

return 0;

/*Case 2:返回一个变量*/

int add(int a, int b

int result = a+b;

return result;

/* Case 3:返回一个表达式,add函数改写一下*/

int add(int a, int b)

return (a+b);

/* Case 4:返回一个函数调用 */

/*STM32编程:是时候深入理解栈文章中提到的递归计算阶乘*/

float factorial(uint32_t n)

uint32_t sp = __get_MSP();

/*记录栈指针的变化情况*/

spSatte[spIndex++] = sp;

if(n==0 || n==1)

return 1;

else

return (float)n*factorial(n-1);

return 咋工作的?首先需要了解函数调用是如何工作的。当调用一个函数时,会发生两件事:

当前函数的执行暂停。

调用的函数执行。

这就是所谓的的控制权转移。当调用一个函数时,程序的控制从调用函数转移到被调用函数。return语句将控制权返回到前一个调用它的函数。该函数将从暂停的地方继续执行。

在调用处,如果查看汇编代码,单片机处理器会将当前CPU的PC指针、临时变量、相关寄存器压栈,调用函数返回时,会将栈的内容弹出到相应的寄存器或者临时变量,以恢复现场。

void 函数真不需要加return吗?事实上不然,这就是本文希望引起注意的一些要点,在哪些场景下需要显式的对void函数添加return语句呢?

传入指针为空指针,这也是很多面试官会考察的要点之一,这样处理会增强程序的健壮性。

void swap(int *a, int *b)

int temp;

/*不可操作空指针*/

if(a==NULL || b==NULL)

return ;

else

temp = *a;

*a = *b;

*b = temp;

传入参数非法或者越界

enum E_DAY{

E_MON=0,

E_TUS,

E_WNd,

E_THR,

E_FRD,

E_SAT,

E_SUN

void set_day(E_DAY day,E_DAY *pDay)

/* 这里就需要判别day参数是否非法越界 */

if(day》E_SUN || day《E_MON || pDay ==NULL)

return;

*pDay = day;

检测到异常时需立即退出当前程序的执行流。

void func(void)

FILE *pFile=fopen(“。/test.csv”,“wt+”);

/*这里就检测到文件无法打开的异常,则需要马上退出*/

if(pFile==NULL)

printf(“file opened failed”);

return ;

fclose(pFile);

总结一下因为容易忽略,其实也是初学者可能不太注意的一些地方,所以在此总结一下:

return的具体做了什么,其内在工作原理需要栈的支持

不带返回值的函数,可不加return语句

带返回值的函数,注意返回值的类型与函数返回值类型一致

void函数,在一些特定的场合加上return语句,可增加程序的健壮性:

传入指针为空指针

传入参数非法或者越界

检测到异常时需立即退出当前程序的执行流

其实非void函数,也墙裂建议这么处理。
责任编辑:pj

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 参数
    +关注

    关注

    11

    文章

    1868

    浏览量

    33755
  • void
    +关注

    关注

    0

    文章

    23

    浏览量

    10204
  • Return
    +关注

    关注

    0

    文章

    9

    浏览量

    7992
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    嵌入可测试性软件设计

    ; return res; } // 调用 cal_func(get_a_from_flash(), 5); 这种类似场景,实际开发中应该有不少,大家平时都是按照方式一写代码还是方式二写代码
    发表于 12-02 06:06

    SConscript文件如何既添加group文件又添加下层的SConscript?

    框架中的SConscript要不就是Return(‘group’)要不就是Return(‘objs’),如果我想要在一个SConscript文件既添加group文件又添加下层文件夹中的
    发表于 09-29 08:12

    和集有什么区别?一篇搞懂!​

    、轻度娱乐,轻便又节能;独适合重度游戏、专业创作,性能强但功耗高。今天,我们就从 “硬件本质”“核心差异”“适用场景”三个维度,彻底讲清两者区别,帮你选电脑时不盲目跟风,精准匹配需求。 ​ 一、独和集
    的头像 发表于 09-19 16:09 4815次阅读
    独<b class='flag-5'>显</b>和集<b class='flag-5'>显</b>有什么区别?一篇搞懂!​

    【RA4M2-SENSOR】coremark 跑分

    文件 在过程中添加c文件和头文件路径 使用coremark需要用到时间,这里我是用systick,使用定时器也是可以的 先配置systick,这里直接在Keil里配置 初始化函数,延时函数
    发表于 09-01 18:32

    【RA4E2开发板评测】FSP5.2之后的串口重定向问题解决方法

    = S_IFCHR; return 0; } errno = EBADF; return 0; } 同时还需要记得添加头文件如下: #include<sys/stat.h
    发表于 08-29 07:02

    【沁恒CH585开发板免费试用体验】+光照传感器及其检测

    ( GPIO_Pin_1, GPIO_ModeOut_PP_5mA ); } 在模拟方式,其发送字节数据的函数为: void BH1750_SendByte(char data) { char
    发表于 07-06 00:08

    多端协同主要应用场景介绍

    :分布游戏场景,平板作为遥控器,智慧屏作为显示器。 接口说明 表3 跨设备连接API接口功能介绍 接口名描述connectServiceExtensionAbility(want: Want
    发表于 05-21 07:37

    使用IntCtrl_IP添加回调函数不起作用是怎么回事?

    使用 IntCtrl_IP 添加回调函数,但它不起作用。 这是我的 LPUART0_ISR 函数 void LPUART0_ISR() { const char* pBuffer
    发表于 04-11 07:38

    函数指针的六个常见应用场景

    函数指针在嵌入开发中有着广泛的应用,它让代码更加灵活,减少冗余,提高可扩展性。很多时候,我们需要根据不同的情况动态调用不同的函数,而函数
    的头像 发表于 04-07 11:58 1119次阅读
    <b class='flag-5'>函数</b>指针的六个常见应用<b class='flag-5'>场景</b>

    飞凌嵌入ElfBoard ELF 1板卡-字符驱动之自动创建节点

    的创建需要先创建一个设备类(使用class_create()函数),然后使用device_create()函数创建设备节点并将其关联到设备类;(四)mydevice_exit(
    发表于 03-18 09:48

    盾华电子 无人机+智慧杆+光平台示范生态场景,落地深圳南山

    盾华电子 无人机+智慧杆+光平台示范生态场景,落地深圳南山
    的头像 发表于 03-17 09:10 685次阅读
    盾华电子 无人机+智慧杆+光<b class='flag-5'>显</b>平台示范生态<b class='flag-5'>场景</b>,落地深圳南山

    函数信号分析仪的原理和应用场景

    函数信号分析仪是一种精密的电子测量仪器,其原理和应用场景如下所述:原理函数信号分析仪的核心原理主要基于信号的频谱分析和时域分析。它通过采集输入信号,并利用数学算法(如傅里叶变换)将信号从时域转换
    发表于 01-20 14:13

    C语言如何处理函数的返回值

    当你在函数的最后写上 return 0 的时候,它是如何返回给调用函数的? 比如 test 函数,为了待会更好的看懂汇编代码,我写成了 return
    的头像 发表于 01-16 09:21 748次阅读

    西门子TIA Portal中函数FC和函数块FB的相互转换

    描述 本文将介绍在西门子 TIA Portal 中使用 Add-In 插件实现函数 FC 和函数块 FB 的相互转换的方法和步骤。 第1步: 添加 PLC 设备。 选择西门子 CPU 1214C
    的头像 发表于 01-15 10:07 3032次阅读
    西门子TIA Portal中<b class='flag-5'>函数</b>FC和<b class='flag-5'>函数</b>块FB的相互转换

    javascript:void(0) 的作用是什么

    = "javascript:void(0)" onclick = "doSomething()" > Click me a > 在这个例子中,点击链接时不会跳转,而是执行 doSomething() 函数。 占位符 : 在某
    的头像 发表于 12-31 15:55 4049次阅读