0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

哪些場(chǎng)景下需要顯式的對(duì)void函數(shù)添加return語(yǔ)句呢?

GReq_mcu168 ? 來(lái)源:玩轉(zhuǎn)單片機(jī) ? 作者:玩轉(zhuǎn)單片機(jī) ? 2020-06-24 11:54 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

return是啥return其英文含義就是返回,用在函數(shù)中,退出當(dāng)前函數(shù)。這個(gè)想必都知道,分兩種情況:

函數(shù)不帶返回值時(shí),如

void func(void)

/*功能代碼*/

return;

對(duì)于不帶返回值函數(shù)返回,其語(yǔ)法為 return;對(duì)于void函數(shù),通常不顯式加return語(yǔ)句,程序會(huì)自動(dòng)返回到其調(diào)用者現(xiàn)場(chǎng)。

所以上述函數(shù)如下改寫一下,效果是一樣的:

void func(void)

/*功能代碼*/

函數(shù)帶返回值,如

int add(int a, int b)

int result = a+b;

return result;

對(duì)于帶返回值函數(shù)返回,其語(yǔ)法為 return 《value》;返回值可以是一些幾種情況:

一個(gè)常數(shù)

一個(gè)變量

計(jì)算式,例如(a + b)* c

調(diào)用另一個(gè)返回值的函數(shù)

注意:返回值的類型須與函數(shù)返回值類型一致,如不一致,編譯器會(huì)自動(dòng)做類型轉(zhuǎn)換,這里容易出現(xiàn)類型轉(zhuǎn)換的錯(cuò)誤

上代碼:

/*Case 1,返回常量*/

/*返回常量,-1表示參數(shù)非法,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:返回一個(gè)變量*/

int add(int a, int b

int result = a+b;

return result;

/* Case 3:返回一個(gè)表達(dá)式,add函數(shù)改寫一下*/

int add(int a, int b)

return (a+b);

/* Case 4:返回一個(gè)函數(shù)調(diào)用 */

/*STM32編程:是時(shí)候深入理解棧文章中提到的遞歸計(jì)算階乘*/

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 咋工作的?首先需要了解函數(shù)調(diào)用是如何工作的。當(dāng)調(diào)用一個(gè)函數(shù)時(shí),會(huì)發(fā)生兩件事:

當(dāng)前函數(shù)的執(zhí)行暫停。

調(diào)用的函數(shù)執(zhí)行。

這就是所謂的的控制權(quán)轉(zhuǎn)移。當(dāng)調(diào)用一個(gè)函數(shù)時(shí),程序的控制從調(diào)用函數(shù)轉(zhuǎn)移到被調(diào)用函數(shù)。return語(yǔ)句將控制權(quán)返回到前一個(gè)調(diào)用它的函數(shù)。該函數(shù)將從暫停的地方繼續(xù)執(zhí)行。

在調(diào)用處,如果查看匯編代碼,單片機(jī)處理器會(huì)將當(dāng)前CPU的PC指針、臨時(shí)變量、相關(guān)寄存器壓棧,調(diào)用函數(shù)返回時(shí),會(huì)將棧的內(nèi)容彈出到相應(yīng)的寄存器或者臨時(shí)變量,以恢復(fù)現(xiàn)場(chǎng)。

void 函數(shù)真不需要加return嗎?事實(shí)上不然,這就是本文希望引起注意的一些要點(diǎn),在哪些場(chǎng)景下需要顯式的對(duì)void函數(shù)添加return語(yǔ)句呢?

傳入指針為空指針,這也是很多面試官會(huì)考察的要點(diǎn)之一,這樣處理會(huì)增強(qiáng)程序的健壯性。

void swap(int *a, int *b)

int temp;

/*不可操作空指針*/

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

return ;

else

temp = *a;

*a = *b;

*b = temp;

傳入?yún)?shù)非法或者越界

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參數(shù)是否非法越界 */

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

return;

*pDay = day;

檢測(cè)到異常時(shí)需立即退出當(dāng)前程序的執(zhí)行流。

void func(void)

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

/*這里就檢測(cè)到文件無(wú)法打開的異常,則需要馬上退出*/

if(pFile==NULL)

printf(“file opened failed”);

return ;

fclose(pFile);

總結(jié)一下因?yàn)槿菀缀雎?,其?shí)也是初學(xué)者可能不太注意的一些地方,所以在此總結(jié)一下:

return的具體做了什么,其內(nèi)在工作原理需要棧的支持

不帶返回值的函數(shù),可不加return語(yǔ)句

帶返回值的函數(shù),注意返回值的類型與函數(shù)返回值類型一致

void函數(shù),在一些特定的場(chǎng)合加上return語(yǔ)句,可增加程序的健壯性:

傳入指針為空指針

傳入?yún)?shù)非法或者越界

檢測(cè)到異常時(shí)需立即退出當(dāng)前程序的執(zhí)行流

其實(shí)非void函數(shù),也墻裂建議這么處理。
責(zé)任編輯:pj

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 參數(shù)
    +關(guān)注

    關(guān)注

    11

    文章

    1867

    瀏覽量

    32931
  • void
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    10058
  • Return
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    7809
收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    函數(shù)指針的六個(gè)常見應(yīng)用場(chǎng)景

    函數(shù)指針在嵌入開發(fā)中有著廣泛的應(yīng)用,它讓代碼更加靈活,減少冗余,提高可擴(kuò)展性。很多時(shí)候,我們需要根據(jù)不同的情況動(dòng)態(tài)調(diào)用不同的函數(shù),而函數(shù)
    的頭像 發(fā)表于 04-07 11:58 ?417次閱讀
    <b class='flag-5'>函數(shù)</b>指針的六個(gè)常見應(yīng)用<b class='flag-5'>場(chǎng)景</b>

    飛凌嵌入ElfBoard ELF 1板卡-字符驅(qū)動(dòng)之自動(dòng)創(chuàng)建節(jié)點(diǎn)

    的創(chuàng)建需要先創(chuàng)建一個(gè)設(shè)備類(使用class_create()函數(shù)),然后使用device_create()函數(shù)創(chuàng)建設(shè)備節(jié)點(diǎn)并將其關(guān)聯(lián)到設(shè)備類;(四)mydevice_exit(
    發(fā)表于 03-18 09:48

    盾華電子 無(wú)人機(jī)+智慧桿+光平臺(tái)示范生態(tài)場(chǎng)景,落地深圳南山

    盾華電子 無(wú)人機(jī)+智慧桿+光平臺(tái)示范生態(tài)場(chǎng)景,落地深圳南山
    的頭像 發(fā)表于 03-17 09:10 ?385次閱讀
    盾華電子 無(wú)人機(jī)+智慧桿+光<b class='flag-5'>顯</b>平臺(tái)示范生態(tài)<b class='flag-5'>場(chǎng)景</b>,落地深圳南山

    函數(shù)信號(hào)分析儀的原理和應(yīng)用場(chǎng)景

    函數(shù)信號(hào)分析儀是一種精密的電子測(cè)量?jī)x器,其原理和應(yīng)用場(chǎng)景如下所述:原理函數(shù)信號(hào)分析儀的核心原理主要基于信號(hào)的頻譜分析和時(shí)域分析。它通過(guò)采集輸入信號(hào),并利用數(shù)學(xué)算法(如傅里葉變換)將信號(hào)從時(shí)域轉(zhuǎn)換
    發(fā)表于 01-20 14:13

    C語(yǔ)言如何處理函數(shù)的返回值

    當(dāng)你在函數(shù)的最后寫上 return 0 的時(shí)候,它是如何返回給調(diào)用函數(shù)的? 比如 test 函數(shù),為了待會(huì)更好的看懂匯編代碼,我寫成了 return
    的頭像 發(fā)表于 01-16 09:21 ?401次閱讀

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

    = "javascript:void(0)" onclick = "doSomething()" > Click me a > 在這個(gè)例子中,點(diǎn)擊鏈接時(shí)不會(huì)跳轉(zhuǎn),而是執(zhí)行 doSomething() 函數(shù)。 占位符 : 在某
    的頭像 發(fā)表于 12-31 15:55 ?2077次閱讀

    SUMIF函數(shù)的應(yīng)用場(chǎng)景分析

    SUMIF函數(shù)在Excel中是一個(gè)強(qiáng)大的數(shù)據(jù)分析工具,特別適用于需要對(duì)數(shù)據(jù)進(jìn)行條件篩選并求和的場(chǎng)景。以下是對(duì)SUMIF函數(shù)應(yīng)用場(chǎng)景的分析:
    的頭像 發(fā)表于 10-30 09:55 ?2734次閱讀

    便攜示波器的技術(shù)原理和應(yīng)用場(chǎng)景

    便攜示波器作為示波器的一種,具有體積小、重量輕、便于攜帶等特點(diǎn),在多個(gè)領(lǐng)域有著廣泛的應(yīng)用。以下是對(duì)其技術(shù)原理和應(yīng)用場(chǎng)景的詳細(xì)介紹:一、技術(shù)原理便攜示波器的基本原理與傳統(tǒng)示波器相同,都是通過(guò)采集
    發(fā)表于 10-24 14:31

    【「嵌入Hypervisor:架構(gòu)、原理與應(yīng)用」閱讀體驗(yàn)】+ Hypervisor應(yīng)用場(chǎng)景調(diào)研

    繼續(xù)研讀《嵌入Hypervisor:架構(gòu)、原理與應(yīng)用》,想搞清楚Hypervisor的具體應(yīng)用場(chǎng)景,是否能用于我們的嵌入產(chǎn)品設(shè)計(jì)。 通過(guò)閱讀“Hypervisor類型和產(chǎn)品”一節(jié),知道了
    發(fā)表于 10-14 11:21

    科技:超高分媒體處理器的應(yīng)用場(chǎng)景有哪些?

    備受關(guān)注,可以廣泛于各種需要高質(zhì)量媒體播放和顯示的場(chǎng)景,給用戶提供更加便捷、高效的使用體驗(yàn)。那么您知道超高分媒體處理器的應(yīng)用場(chǎng)景有哪些嗎?下面盛科技小編為您介紹: 超高分媒體處理器的
    的頭像 發(fā)表于 09-19 17:47 ?508次閱讀

    脈沖線圈測(cè)試儀的技術(shù)原理和應(yīng)用場(chǎng)景

    能是否良好。電暈放電是絕緣不良的一種表現(xiàn),通過(guò)檢測(cè)電暈放電的發(fā)生,測(cè)試儀能夠及時(shí)發(fā)現(xiàn)并定位絕緣問(wèn)題。 應(yīng)用場(chǎng)景脈沖線圈測(cè)試儀廣泛應(yīng)用于各種需要檢測(cè)線圈質(zhì)量的場(chǎng)景,包括但不限于: 電機(jī)
    發(fā)表于 09-18 14:29

    HarmonyOS Next原生應(yīng)用開發(fā)-從TS到ArkTS的適配規(guī)則(十六)

    一、限制省略函數(shù)返回類型標(biāo)注 規(guī)則:arkts-no-implicit-return-types 級(jí)別:錯(cuò)誤 ArkTS在部分場(chǎng)景中支持對(duì)函數(shù)返回類型進(jìn)行推斷。當(dāng)
    發(fā)表于 08-20 14:08

    面試???1:函數(shù)指針與指針函數(shù)、數(shù)組指針與指針數(shù)組

    在嵌入開發(fā)領(lǐng)域,函數(shù)指針、指針函數(shù)、數(shù)組指針和指針數(shù)組是一些非常重要但又容易混淆的概念。理解它們的特性和應(yīng)用場(chǎng)景,對(duì)于提升嵌入程序的效率
    的頭像 發(fā)表于 08-10 08:11 ?1402次閱讀
    面試???1:<b class='flag-5'>函數(shù)</b>指針與指針<b class='flag-5'>函數(shù)</b>、數(shù)組指針與指針數(shù)組

    HarmonyOS Next原生應(yīng)用開發(fā)-從TS到ArkTS的適配規(guī)則(九)

    函數(shù),編譯器將自動(dòng)添加一個(gè)默認(rèn)構(gòu)造函數(shù)。 } functiongetPoint(o: Point): Point { return o; } // 字面量初始化
    發(fā)表于 07-25 11:26

    看見很多函數(shù)前加了void ICACHE_FLASH_ATTR,這句是什么意思?

    看見很多函數(shù)前加了void ICACHE_FLASH_ATTR,這句是什么意思?什么情況需要加上ICACHE_FLASH_ATTR。
    發(fā)表于 07-22 06:45

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品