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

    文章

    1769

    浏览量

    32060
  • void
    +关注

    关注

    0

    文章

    23

    浏览量

    9851
  • Return
    +关注

    关注

    0

    文章

    9

    浏览量

    7597
收藏 人收藏

    评论

    相关推荐

    SUMIF函数的应用场景分析

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

    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

    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 2234次阅读

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

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

    java环境如何使用hash函数

    在Java环境使用散列函数(hash function)是一种常见的操作。散列函数是将任意大小的数据转换为固定大小的输出值的函数。在Java中,散列
    的头像 发表于 12-06 15:52 408次阅读

    oracle执行sql查询语句的步骤是什么

    。以下是对每个步骤的详尽、详实、细致的解释。 编写SQL语句: SQL(结构化查询语言)是一种用于与数据库进行通信的标准语言。在使用Oracle执行SQL查询之前,首先需要编写SQL语句。SQL
    的头像 发表于 12-06 10:49 886次阅读

    if嵌套函数的正确输入方法为

    (): # 主函数逻辑 if condition: # if语句的逻辑 def nested_function (): # 嵌套函数的逻辑 return resultnested_r
    的头像 发表于 11-30 16:50 1309次阅读

    if函数的嵌套使用方法及实例

    。 一、if函数简介 if函数是编程中常见的条件语句,用于根据不同的条件执行不同的操作。它的一般格式如下: if 条件: 执行语句 以上是最基本的if
    的头像 发表于 11-30 16:46 6016次阅读

    python函数返回多个参数

    。 在Python中,可以使用关键字 return 来返回一个或多个值。在函数定义的末尾,可以使用 return 语句来指定函数要返回的值。
    的头像 发表于 11-21 16:37 1166次阅读

    append()和insert()函数的区别

    在Python中, append() 和 insert() 是用于修改列表的两个常用函数。这两个函数的主要区别在于元素添加的位置和方式。 首先,让我们来了解一 append()
    的头像 发表于 11-21 14:44 2677次阅读

    用insert语句在表中添加数据

    在数据库中使用INSERT语句向表中添加数据是非常常见的操作,本文将详尽、详实、细致地介绍相关的知识点和步骤。文章将会从以下几个方面进行详细的阐述: 一、插入数据的背景与概述 二、INSERT语句
    的头像 发表于 11-21 14:21 4212次阅读

    oracle数据库添加字段语句

    Oracle数据库添加字段语句是在已有表中添加新的列,以扩展表的结构和功能。添加字段语句的语法有多种,可以根据实际需求选择不同的语法。下面将
    的头像 发表于 11-21 11:37 6522次阅读