函数return,有些地方你可能还没掌握
[導(dǎo)讀] 喜聞C語言重登王座,作為一個C語言用的相對較多的碼農(nóng),還是有點興奮。本文來聊一聊,你可能沒在意的C語言中return的一些使用技巧,分享給大家。
return是啥
return其英文含義就是返回,用在函數(shù)中,退出當(dāng)前函數(shù)。這個想必都知道,分兩種情況:
函數(shù)不帶返回值時,如
對于不帶返回值函數(shù)返回,其語法為 return;對于void函數(shù),通常不顯式加return語句,程序會自動返回到其調(diào)用者現(xiàn)場。
所以上述函數(shù)如下改寫一下,效果是一樣的:
void?func(void) {/*功能代碼*/... }函數(shù)帶返回值,如
對于帶返回值函數(shù)返回,其語法為 return <value>;返回值可以是一些幾種情況:
一個常數(shù)
一個變量
計算式,例如(a + b)* c
調(diào)用另一個返回值的函數(shù)
注意:返回值的類型須與函數(shù)返回值類型一致,如不一致,編譯器會自動做類型轉(zhuǎn)換,這里容易出現(xiàn)類型轉(zhuǎ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;elsereturn?(float)n*factorial(n-1); }return 咋工作的?
首先需要了解函數(shù)調(diào)用是如何工作的。當(dāng)調(diào)用一個函數(shù)時,會發(fā)生兩件事:
當(dāng)前函數(shù)的執(zhí)行暫停。
調(diào)用的函數(shù)執(zhí)行。
這就是所謂的的控制權(quán)轉(zhuǎn)移。當(dāng)調(diào)用一個函數(shù)時,程序的控制從調(diào)用函數(shù)轉(zhuǎn)移到被調(diào)用函數(shù)。return語句將控制權(quán)返回到前一個調(diào)用它的函數(shù)。該函數(shù)將從暫停的地方繼續(xù)執(zhí)行。
在調(diào)用處,如果查看匯編代碼,單片機或處理器會將當(dāng)前CPU的PC指針、臨時變量、相關(guān)寄存器壓棧,調(diào)用函數(shù)返回時,會將棧的內(nèi)容彈出到相應(yīng)的寄存器或者臨時變量,以恢復(fù)現(xiàn)場。關(guān)于棧的解釋可以參見號內(nèi)文章:<<STM32編程:是時候深入理解棧>>
void 函數(shù)真不需要加return嗎?
事實上不然,這就是本文希望引起注意的一些要點,在哪些場景下需要顯式的對void函數(shù)添加return語句呢?
傳入指針為空指針,這也是很多面試官會考察的要點之一,這樣處理會增強程序的健壯性。
傳入?yún)?shù)非法或者越界
檢測到異常時需立即退出當(dāng)前程序的執(zhí)行流。
總結(jié)一下
因為容易忽略,其實也是初學(xué)者可能不太注意的一些地方,所以在此總結(jié)一下:
return的具體做了什么,其內(nèi)在工作原理需要棧的支持
不帶返回值的函數(shù),可不加return語句
帶返回值的函數(shù),注意返回值的類型與函數(shù)返回值類型一致
void函數(shù),在一些特定的場合加上return語句,可增加程序的健壯性:
傳入指針為空指針
傳入?yún)?shù)非法或者越界
檢測到異常時需立即退出當(dāng)前程序的執(zhí)行流
其實非void函數(shù),也墻裂建議這么處理。
-END-
猜你喜歡這是我的C語言入門筆記。 C語言中,全局變量濫用的后果竟如此嚴重? 各路大牛的C語言編程建議和技巧!?最 后?若覺得文章不錯,轉(zhuǎn)發(fā)分享,也是我們繼續(xù)更新的動力。5T資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、單片機、等等!在公眾號內(nèi)回復(fù)「更多資源」,即可免費獲取,期待你的關(guān)注~長按識別圖中二維碼關(guān)注總結(jié)
以上是生活随笔為你收集整理的函数return,有些地方你可能还没掌握的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 终于等到你!2020年电子设计竞赛来了!
- 下一篇: 555定时器,你知道它的功能有多强大吗?