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

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

3天内不再提示

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

GReq_mcu168 来源:玩转单片机 作者:玩转单片机 2020-06-24 11:54 3365次阅读

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

    文章

    1829

    浏览量

    32194
  • void
    +关注

    关注

    0

    文章

    23

    浏览量

    9866
  • Return
    +关注

    关注

    0

    文章

    9

    浏览量

    7609
收藏 人收藏

    相关推荐

    SUMIF函数的应用场景分析

    SUMIF函数在Excel中是一个强大的数据分析工具,特别适用于需要对数据进行条件筛选并求和的场景。以下是对SUMIF函数应用场景的分析:
    的头像 发表于 10-30 09:55 312次阅读

    【「嵌入Hypervisor:架构、原理与应用」阅读体验】+ Hypervisor应用场景调研

    继续研读《嵌入Hypervisor:架构、原理与应用》,想搞清楚Hypervisor的具体应用场景,是否能用于我们的嵌入产品设计。 通过阅读“Hypervisor类型和产品”一节,知道了
    发表于 10-14 11:21

    脉冲线圈测试仪的技术原理和应用场景

    能是否良好。电晕放电是绝缘不良的一种表现,通过检测电晕放电的发生,测试仪能够及时发现并定位绝缘问题。 应用场景脉冲线圈测试仪广泛应用于各种需要检测线圈质量的场景,包括但不限于: 电机
    发表于 09-18 14:29

    HarmonyOS Next原生应用开发-从TS到ArkTS的适配规则(十六)

    一、限制省略函数返回类型标注 规则:arkts-no-implicit-return-types 级别:错误 ArkTS在部分场景中支持对函数返回类型进行推断。当
    发表于 08-20 14:08

    HarmonyOS Next原生应用开发-从TS到ArkTS的适配规则(九)

    函数,编译器将自动添加一个默认构造函数。 } functiongetPoint(o: Point): Point { return o; } // 字面量初始化
    发表于 07-25 11:26

    看见很多函数前加了void ICACHE_FLASH_ATTR,这句是什么意思?

    看见很多函数前加了void ICACHE_FLASH_ATTR,这句是什么意思?什么情况需要加上ICACHE_FLASH_ATTR。
    发表于 07-22 06:45

    HarmonyOS实战开发-合理选择条件渲染和隐控制

    通过条件渲染或隐控制,实现组件的显示和隐藏间的切换,两者的适用场景分别如下: 条件渲染的适用场景: 在应用冷启动阶段,应用加载绘制首页时,如果组件初始不需要显示,建议使用条件渲染替
    发表于 05-10 15:16

    stm32f030从return跳出会死在void HardFault_Handler(void)的原因?怎么解决?

    第一层就死在void HardFault_Handler(void)了 case 10: { delay_ms (10);//消抖 return; }
    发表于 04-24 08:21

    C语言函数指针六大应用场景详解

    函数指针是一种非常强大的编程工具,它可以让我们以更加灵活的方式编写程序。在本文中,我们将介绍 6 个函数指针的高级应用场景,并贴出相应的代码案例和解释。
    的头像 发表于 04-23 18:19 882次阅读

    STM32CUBEMX4.22.1在main函数里面添加一行语句就死机的原因?

    用STM32CUBEMX4.22.1版本,内嵌FREERTOS,想把4路ADC通过DMA方式采集,但是在main函数里面添加一行语句:HAL_ADC_Start_DMA( hadc1, ADC_DMA_Buf[0],4);后就死
    发表于 04-11 07:57

    在stm32f1xx_ll_utils.c中提供的延时函数,以下标红语句为什么要多加1

    在stm32f1xx_ll_utils.c中提供的延时函数,以下标红语句为什么要多加1?延时1ms不就变成2ms了吗? void LL_mDelay(uint32_t Delay)
    发表于 03-26 06:08

    assign语句和always语句的用法

    ," "是要赋值的信号或变量名," "是要赋给该信号或变量的值。 Assign语句的应用场景 Assign语句通常用于组合逻
    的头像 发表于 02-22 16:24 2529次阅读

    M451串口回问题需要怎么关闭?

    M451串口回问题需要怎么关闭?
    发表于 01-16 06:47

    为什么ADuC7060运行的时候始终处于中断函数__irq __arm void IRQ_Handler(void)里面?

    的中断,这个定时器还是会产生中断?应该怎么样才能关闭这个中断? 另外需要明确的一点是:我前面因为要用到外部晶振,所以在初始化的时候有这么一段语句,是从数据手册上摘抄下来的: void
    发表于 01-15 08:06

    嵌入open函数的使用

    嵌入系统是指嵌入到其他设备或系统中,用于控制和管理硬件资源的计算机系统。在嵌入系统中,通常需要与外部设备进行数据交互,例如读取传感器数据、控制执行器等。open函数是C语言标准库中
    的头像 发表于 01-04 15:51 677次阅读