return 函数
return是啥
return其英文含義就是返回,用在函數中,退出當前函數。這個想必都知道,分兩種情況:
-
函數不帶返回值時,如
對于不帶返回值函數返回,其語法為 return;對于void函數,通常不顯式加return語句,程序會自動返回到其調用者現場。
所以上述函數如下改寫一下,效果是一樣的:
void?func(void){/*功能代碼*/...}-
函數帶返回值,如
對于帶返回值函數返回,其語法為 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語句呢?
-
傳入指針為空指針,這也是很多面試官會考察的要點之一,這樣處理會增強程序的健壯性。
-
傳入參數非法或者越界
-
檢測到異常時需立即退出當前程序的執行流。
總結一下
因為容易忽略,其實也是初學者可能不太注意的一些地方,所以在此總結一下:
-
return的具體做了什么,其內在工作原理需要棧的支持
-
不帶返回值的函數,可不加return語句
-
帶返回值的函數,注意返回值的類型與函數返回值類型一致
-
void函數,在一些特定的場合加上return語句,可增加程序的健壯性:
-
-
傳入指針為空指針
-
傳入參數非法或者越界
-
檢測到異常時需立即退出當前程序的執行流
-
其實非void函數,也強烈建議這么處理。
-
總結
- 上一篇: java module和model_Ja
- 下一篇: 【ACM 2020 - Text Rec