函數(shù)return,有些地方你可能還沒(méi)掌握
[導(dǎo)讀] 喜聞C語(yǔ)言重登王座,作為一個(gè)C語(yǔ)言用的相對(duì)較多的碼農(nóng),還是有點(diǎn)興奮。本文來(lái)聊一聊,你可能沒(méi)在意的C語(yǔ)言中return的一些使用技巧,分享給大家。
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ù)如下改寫(xiě)一下,效果是一樣的:
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ù)改寫(xiě)一下*/
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)。關(guān)于棧的解釋可以參見(jiàn)號(hào)內(nèi)文章:<<STM32編程:是時(shí)候深入理解棧>>
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ú)法打開(kāi)的異常,則需要馬上退出*/
if(pFile==NULL)
{
printf("file opened failed");
return ;
}
.....
fclose(pFile);
}
總結(jié)一下
因?yàn)槿菀缀雎裕鋵?shí)也是初學(xué)者可能不太注意的一些地方,所以在此總結(jié)一下:
—END—
如果喜歡右下點(diǎn)個(gè)在看,也會(huì)讓我倍感鼓舞
關(guān)注置頂:掃描左下二維碼關(guān)注公眾號(hào)加星
加群交流:掃描右下二維碼添加,發(fā)送“加群”
關(guān)注 |
加群 |
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!