每個(gè)程序員對(duì)return語句并不陌生骨望,初學(xué)者很少會(huì)顧及返回值,甚至于不知道return語句有啥作用。但是如果有點(diǎn)工作經(jīng)驗(yàn)的人應(yīng)該會(huì)重視并利用這個(gè)返回值來定位處理問題雾鬼,或者說留下特征值作為判斷依據(jù)。
如果面試題目問你return語句的作用宴树,那么我建議你可以簡(jiǎn)答為:
1.返回一個(gè)值策菜,這個(gè)值可以是任意類型,也包括void酒贬;
2.使程序返回到操作系統(tǒng)(即終止程序)
幾乎所有的語言里都會(huì)有return語句又憨,沒有return語句,那么你這段代碼可能有千百萬行锭吨,正如下坡過程中沒有剎車一般蠢莺,直接梭到完。很明顯零如,這樣的程序像一大坨XX躏将,可讀性不好,令人難以接受考蕾。這里不接受用goto祸憋,或者匯編語言里的jump語句來跳出這種解釋。如果你有些時(shí)間辕翰,那么我會(huì)建議你讀完后面的內(nèi)容夺衍。
當(dāng)然特別的是,有些語言允許你return多個(gè)值喜命,比如Python沟沙,當(dāng)然這個(gè)返回多個(gè)值本質(zhì)上也是返回一個(gè)值,是以元組的方式返回壁榕。
return語句用于結(jié)束當(dāng)前正在執(zhí)行的函數(shù)矛紫,并將控制權(quán)返回給調(diào)用此函數(shù)的函數(shù)。主要有兩種形式:
沒有返回值牌里,直接return颊咬;
有返回值,return expression牡辽;
不帶返回值的函數(shù)
不帶返回值的return語句喳篇,也就是返回類型是void。在返回類型為void的函數(shù)中态辛,return返回語句不是必需的麸澜,隱式的return發(fā)生在函數(shù)的最后一個(gè)語句完成時(shí)。如果一個(gè)程序返回為void奏黑,也就意味著你可以不用寫return語句炊邦,不寫他會(huì)自動(dòng)調(diào)用编矾。
具有返回值的函數(shù)
任何返回類型不是void的函數(shù)都必須返回一個(gè)值,而且這個(gè)返回值的類型必須和函數(shù)的返回類型相同馁害,或者能隱式轉(zhuǎn)化為函數(shù)的返回類型窄俏。
盡管C++不能確保結(jié)果的正確性,但能保證函數(shù)每一次return都返回適當(dāng)類型的結(jié)果碘菜。每一次判斷返回的return當(dāng)中凹蜈,必須要有返回值。
但也有編譯器不能檢測(cè)出的漏洞炉媒,比如在含有return語句的循環(huán)后沒有提供return語句是很危險(xiǎn)的踪区,這個(gè)時(shí)候運(yùn)行時(shí)會(huì)出現(xiàn)什么問題是不確定的。返回值有以下幾種情況:
1.主函數(shù)main的返回值
返回類型不是void的函數(shù)必須返回一個(gè)值吊骤,但此規(guī)則有一個(gè)例外的情況:允許主函數(shù)main沒有返回值就可結(jié)束缎岗。如果程序控制執(zhí)行到主函數(shù)main的最后一個(gè)語句都還沒有返回,那么編譯器會(huì)隱式地插入返回0 的語句白粉。
2.返回非引用類型
當(dāng)函數(shù)返回非引用類型時(shí)传泊,其返回值既可以是局部對(duì)象,也可以是求解表達(dá)式的結(jié)果鸭巴。
3.返回引用
當(dāng)函數(shù)返回引用類型時(shí)眷细,沒有復(fù)制返回值。相反鹃祖,返回的是對(duì)象本身溪椎。
4.千萬不要返回局部對(duì)象的引用
當(dāng)函數(shù)執(zhí)行完畢時(shí),將釋放分配給局部對(duì)象的存儲(chǔ)空間恬口,此時(shí)局部對(duì)象的引用就會(huì)指向不確定的內(nèi)存校读。這個(gè)地方是很多新手都會(huì)換的錯(cuò)誤。然后出現(xiàn)問題了祖能,debug半天也沒發(fā)現(xiàn)問題歉秫。
5.引用返回左值
這個(gè)是常用的地方,如果你不希望引用返回值被修改养铸,返回值可以聲明為const
6.千萬不要返回指向局部對(duì)象的指針
當(dāng)函數(shù)的返回指針類型和局部對(duì)象的引用一樣雁芙,返回指向局部對(duì)象的指針也是錯(cuò)誤的。一旦函數(shù)結(jié)束钞螟,局部對(duì)象被釋放兔甘,返回的指針就變成了指向不存在的對(duì)象的懸垂指針。
很多時(shí)候鳞滨,我們debug問題基本就是根據(jù)返回值來定位的裂明,給出的返回值能夠追溯問題的本源,重視r(shí)eturn語句,用好他闽晦,你可以百萬軍中取上將首級(jí)。不是所有的編譯器都可以檢測(cè)出你return語句的問題提岔,有些不嚴(yán)謹(jǐn)?shù)木幾g器不會(huì)去判斷你給的return值是不是跟返回類型一樣仙蛉,甚至有些需要返回值而你沒return值也讓你通過,這樣是很可怕的碱蒙,這個(gè)返回值可能就是定時(shí)的炸彈荠瘪。
當(dāng)然,return語句還在許多組合中赛惩,比如在try catch return拋出異常哀墓,在if else中的作用,用好他喷兼,能讓你的代碼更簡(jiǎn)練篮绰,讓你的代碼更優(yōu)雅。
兔云程序
致力于推廣編程教程季惯,服務(wù)程序員
22篇原創(chuàng)內(nèi)容
公眾號(hào)