[英]Type No return, in function returning non-void
我的C ++代碼如下所示:
int f(int i){
if (i > 0) return 1;
if (i == 0) return 0;
if (i < 0) return -1;
}
它工作但我仍然得到:
警告:沒有返回,函數返回非void
盡管很明顯所有案例都被涵蓋了。 有沒有辦法以“正確”的方式處理這個問題?
編譯器沒有意識到if
條件涵蓋所有可能的條件。 因此,它認為if
s,執行流程仍然可以通過所有流程。
因為這些條件中的任何一個都假設其他條件為假,您可以這樣寫:
int f(int i) {
if (i > 0) return 1;
else if (i == 0) return 0;
else return -1;
}
因為return
語句最終終止了一個函數,我們可以將它縮短為:
int f(int i) {
if (i > 0) return 1;
if (i == 0) return 0;
return -1;
}
注意缺少else
兩個。
有沒有辦法以“正確”的方式處理這個問題?
一個簡單的解決方法是擺脫最后的if。 由於前兩個要么被調用,所以如果你到達它,必須調用第三個案例
int f(int i){
if (i > 0) return 1;
if (i == 0) return 0;
return -1;
}
我們必須這樣做的原因是編譯器不能保證在每種情況下都會調用if語句。 由於它到達函數的末尾並且可能沒有執行任何if語句,因此它會發出警告。
只是幫助編譯器理解您的代碼。 以下列方式重寫該功能
int f(int i){
if (i > 0) return 1;
else if (i == 0) return 0;
else return -1;
}
你也可以編寫函數,例如
int f( int i )
{
return i == 0 ? 0 : ( i < 0 ? -1 : 1 );
}
在一行中編寫函數的另一種方法如下
int f( int i )
{
return ( i > 0 ) - ( i < 0 );
}
編譯器不知道所有選項都被覆蓋,因為就函數的語法而言,沒有任何建議。
一個簡化的例子:
int f(int i)
if if if
(int > int), return (int == int), return (int < int), return
一個更清晰的結構,如if/else
,每個都有一個返回值,產生一個Abstract-Syntax-Tree,它清楚地顯示每種情況下都有一個返回值。 但是,您的依賴於AST中節點的評估,這在語法檢查中沒有涉及(通過它會發出警告)。
除了純語法之外,如果編譯器在嘗試找出程序的行為時依賴於“可能的”評估,那么它最終需要糾纏自己並且可能會遇到停頓問題。 即使它設法覆蓋了某些情況,這可能會產生更多來自用戶的問題,而且還會冒一個全新的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.