www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 嵌入式 > 嵌入式客棧
[導讀]關注、星標 嵌入式客棧 ,干貨及時送達 [導讀] 喜聞C語言重登王座,作為一個C語言用的相對較多的碼農(nóng),還是有點興奮。本文來聊一聊,你可能沒在意的C語言中return的一些使用技巧,分享給大家。 return是啥 return其英文含義就是返回,用在函數(shù)中,退出當前函

關注、星標 嵌入式客棧 ,干貨及時送達

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

return是啥

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

  • 函數(shù)不帶返回值時,如
void func(void)
{
   /*功能代碼*/
   ...
   return;
}

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

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

void func(void)
{
   /*功能代碼*/
   ...
}
  • 函數(shù)帶返回值,如
int add(int a, int b)
{
    int result = a+b;
    return result;
}

對于帶返回值函數(shù)返回,其語法為 return <value>;返回值可以是一些幾種情況:

  • 一個常數(shù)
  • 一個變量
  • 計算式,例如(a + b)* c
  • 調(diào)用另一個返回值的函數(shù)

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

上代碼:

/*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:返回一個變量*/
int add(int a, int b)
{
    int result = a+b;
    return result;
}

/* Case 3:返回一個表達式,add函數(shù)改寫一下*/
int add(int a, int b)
{
    return (a+b);
}

/* Case 4:返回一個函數(shù)調(diào)用 */
/*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 咋工作的?

首先需要了解函數(shù)調(diào)用是如何工作的。當調(diào)用一個函數(shù)時,會發(fā)生兩件事:

  1. 當前函數(shù)的執(zhí)行暫停。
  2. 調(diào)用的函數(shù)執(zhí)行。

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

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

void 函數(shù)真不需要加return嗎?

事實上不然,這就是本文希望引起注意的一些要點,在哪些場景下需要顯式的對void函數(shù)添加return語句呢?

  • 傳入指針為空指針,這也是很多面試官會考察的要點之一,這樣處理會增強程序的健壯性。
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;
}
  • 檢測到異常時需立即退出當前程序的執(zhí)行流。
void func(void)
{
    FILE *pFile=fopen("./test.csv","wt+");
    /*這里就檢測到文件無法打開的異常,則需要馬上退出*/
    if(pFile==NULL)
    {
        printf("file opened failed");
        return ;
    }

    .....

    fclose(pFile);
}

總結一下

因為容易忽略,其實也是初學者可能不太注意的一些地方,所以在此總結一下:

  • return的具體做了什么,其內(nèi)在工作原理需要棧的支持
  • 不帶返回值的函數(shù),可不加return語句
  • 帶返回值的函數(shù),注意返回值的類型與函數(shù)返回值類型一致
  • void函數(shù),在一些特定的場合加上return語句,可增加程序的健壯性:
    • 傳入指針為空指針
    • 傳入?yún)?shù)非法或者越界
    • 檢測到異常時需立即退出當前程序的執(zhí)行流
    • 其實非void函數(shù),也墻裂建議這么處理。

END

果喜歡右下點個在看,也會讓我倍感鼓舞

往期精彩推薦,點擊即可閱讀




▲抽象思想解讀Linux進程描述符
讀U-Boot源碼-C語言編程大法總結篇一
讀U-Boot源碼-C語言編程技巧總結篇二
基于Buildroot的Linux構建之根文件系統(tǒng)
手把手教系列之移動平均濾波器C實現(xiàn)
手把手教系列之IIR數(shù)字濾波器設計實現(xiàn)

關注置頂:掃描左下二維碼關注公眾號加星

加群交流:掃描右下二維碼添加,發(fā)送“加群”

關注

加群

免責聲明:本文內(nèi)容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉