日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

函数return,有些地方你可能还没掌握

發布時間:2023/12/19 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 函数return,有些地方你可能还没掌握 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[導讀] 喜聞C語言重登王座,作為一個C語言用的相對較多的碼農,還是有點興奮。本文來聊一聊,你可能沒在意的C語言中return的一些使用技巧,分享給大家。

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;elsereturn?(float)n*factorial(n-1); }

return 咋工作的?

首先需要了解函數調用是如何工作的。當調用一個函數時,會發生兩件事:

  • 當前函數的執行暫停。

  • 調用的函數執行。

  • 這就是所謂的的控制權轉移。當調用一個函數時,程序的控制從調用函數轉移到被調用函數。return語句將控制權返回到前一個調用它的函數。該函數將從暫停的地方繼續執行。

    在調用處,如果查看匯編代碼,單片機或處理器會將當前CPU的PC指針、臨時變量、相關寄存器壓棧,調用函數返回時,會將棧的內容彈出到相應的寄存器或者臨時變量,以恢復現場。關于棧的解釋可以參見號內文章:<<STM32編程:是時候深入理解棧>>

    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函數,也墻裂建議這么處理。

    -END-

    猜你喜歡這是我的C語言入門筆記。 C語言中,全局變量濫用的后果竟如此嚴重? 各路大牛的C語言編程建議和技巧!?最 后?若覺得文章不錯,轉發分享,也是我們繼續更新的動力。5T資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、單片機、等等!在公眾號內回復「更多資源」,即可免費獲取,期待你的關注~長按識別圖中二維碼關注

    總結

    以上是生活随笔為你收集整理的函数return,有些地方你可能还没掌握的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。