簡體   English   中英

在返回非void的函數中鍵入No return

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM