簡體   English   中英

遞歸的默認返回值

[英]Default return value in recursion

考慮以下眾所周知的代碼來查找數字的階乘。

int fact(int num)
{
    if (num != 1)
        return num * fact(num - 1);
    else
        return num;
}

現在考慮相同的另一個變體

int fact(int num)
{
    if (num != 1)
        return num * fact(num - 1);
}

第一個看起來很干凈,如果我們給num作為4,它將是4*3*2*1 即使編譯器可能發出警告,第二個也可以正常工作。 但是在后一種情況下,如果num變為1,則沒有return語句。那么計算如何進行? 該代碼僅在num為1時返回1時才有效。有人可以解釋一下4*3*2*x發生了什么。 x如何返回為1。謝謝。

編輯:我正在使用gcc 4.8.2

第二種錯誤是不正確的,沒有“默認返回值”之類的東西,這種行為是完全不確定的!

考慮一下,編譯器將如何知道fact(1) == 1

如果讓我猜測,我會說您想避免使用else東西,在這種情況下,默認的返回值應該是最后一句話。

int fact(int num)
{ // pre: num > 0
    if (num != 1)
        return num * fact(num - 1); 
    return num;
}

第二段代碼不正確,您認為不重要的警告可能類似於:

警告:控制到達非無效功能的結尾

您必須在所有路徑中提供返回值,否則(當num1 )是未定義的行為,沒有默認的返回值main除外)。

這是未定義的行為,這意味着結果完全取決於特定的編譯器。 因此,我認為您應該避免這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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