W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
前面我們用過的一些內(nèi)置函數(shù)(如數(shù)學(xué)函數(shù))都會(huì)生成結(jié)果值。也就是說,調(diào)用函數(shù)的效果是產(chǎn)生一個(gè)新值,一般我們會(huì)把這個(gè)值賦給變量,或用作表達(dá)式的一部分。例如:
double e = exp(1.0);
double height = radius * sin(angle);
但到目前為止,我們編寫的所有函數(shù)都是void函數(shù),它們不返回任何值。調(diào)用void函數(shù)時(shí),常見的是函數(shù)調(diào)用語句本身占一行,沒有賦值操作:
nLines(3);
countdown(n-1);
本章我們將學(xué)習(xí)編寫帶有返回值的函數(shù),因?yàn)闆]有更好的名字,我索性直接稱之為“有返回值的函數(shù)”。第一個(gè)例子是area函數(shù),它以一個(gè)double值為參數(shù),返回以給定參數(shù)值為半徑的圓的面積:
double area(double radius) {
double pi = acos(-1.0);
double area = pi * radius * radius;
return area;
}
首先要注意到,該函數(shù)定義的開始部分與void函數(shù)(如果以“void”開始,則說明這是void函數(shù))不同,這里使用了double,說明函數(shù)返回double類型的值。
再就是注意最后一行,這是return語句的一種可選形式,它帶了一個(gè)返回值。這句話的意思是,”以其后的表達(dá)式為返回值,立即從函數(shù)返回?!氨磉_(dá)式可以非常復(fù)雜,所以area函數(shù)可以簡(jiǎn)化為:
double area(double radius) {
return acos(-1.0) * radius * radius;
}
另一方面,像area這樣的臨時(shí)變量會(huì)使調(diào)試更容易。不管哪種情況,return語句中表達(dá)式的類型必須與函數(shù)的返回類型匹配。換句話說,當(dāng)把函數(shù)的返回類型聲明為double時(shí),就要保證函數(shù)最終會(huì)得到一個(gè)double值。如果不返回任何表達(dá)式,或者返回了類型不匹配的表達(dá)式,編譯器都會(huì)報(bào)錯(cuò)。
有時(shí)包含多個(gè)返回語句是有用的,比如每個(gè)分支一個(gè):
double absoluteValue(double x){
if (x < 0) {
return -x;
} else {
reurn x;
}
}
這些return語句分布在不同的條件分支中,只有一個(gè)能執(zhí)行。雖然函數(shù)可以有多個(gè)return語句,但是只要其中一個(gè)執(zhí)行,函數(shù)也就隨之結(jié)束了,不會(huì)再執(zhí)行后面的語句。
return語句后面的代碼,或任何不可能執(zhí)行到的代碼,稱為“死代碼”。如果存在死代碼,有的編譯器會(huì)給出警告。
如果return語句在一個(gè)條件分支中,必須保證每個(gè)可能的路徑都能碰到return語句。例如:
double absoluteValue(double x) {
if(x < 0) {
return –x;
} else if(x > 0) {
return x;
} // 錯(cuò)誤
}
這個(gè)函數(shù)是錯(cuò)誤的,因?yàn)楫?dāng)x為0的時(shí)候,所有條件都不滿足,最終函數(shù)找不到相應(yīng)的return語句。非常不幸,很多C++編譯器并不捕捉此類錯(cuò)誤,程序可以通過編譯并運(yùn)行,但是當(dāng)x==0時(shí)返回值可能是任意值,而且在不同環(huán)境下也可能有不同表現(xiàn)。
現(xiàn)在你可能還是很討厭看到編譯錯(cuò)誤信息,但是隨著經(jīng)驗(yàn)的增長(zhǎng),你會(huì)意識(shí)到:當(dāng)程序有錯(cuò)誤時(shí),不出現(xiàn)編譯錯(cuò)誤會(huì)比出現(xiàn)更糟糕。
有時(shí)會(huì)有這樣的事情,你用一些值測(cè)試了absoluteValue函數(shù),而且該函數(shù)看起來是可以正常工作的,可是當(dāng)你把程序交給別人在其他環(huán)境下測(cè)試時(shí),卻出現(xiàn)了不可思議的bug,經(jīng)過幾天的調(diào)試你才發(fā)現(xiàn)absoluteValue的實(shí)現(xiàn)有問題。要是編譯器能早發(fā)現(xiàn)問題并警告你該多好?。?/p>
從現(xiàn)在開始,如果編譯器指出了程序中的錯(cuò)誤,請(qǐng)不要抱怨編譯器。相反,你應(yīng)該感謝編譯器幫你找出錯(cuò)誤,而且節(jié)約了你數(shù)天的調(diào)試時(shí)間。有的編譯器可以通過選項(xiàng)指定更嚴(yán)格的編譯檢查并報(bào)告所有錯(cuò)誤。你要一直開著這些選項(xiàng)。
說句題外話,math庫(kù)中的fabs函數(shù)能夠正確計(jì)算double變量的絕對(duì)值。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: