簡體   English   中英

為什么此遞歸程序有效?

[英]why does this recursion program work?

#include <iostream>

using namespace std;

int main() {
    int n,x;
    int fact(int);

    cin >> n;

    x = fact(n);

    cout << x;

    return 0;
}

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

在最后一種情況下,當傳遞給函數fact的參數為1時,如何在我無需在代碼中指定的情況下計算出fact(1)等於1的情況?

該程序依賴於未定義的行為。 當然不能保證它能正常工作,但是您可能會發現這樣一種情況,您發送的參數(1)處於調用代碼將其視為返回值的位置。 不要依賴此行為。

許多C ++編譯器會因為存在語義問題而拒絕此代碼: 並非所有控制路徑都從fact()返回值

 int fact(int n); 

此函數簽名返回一個整數,但是當給定n = 1時,您的實現中沒有相應的return語句。 在那種情況下,該函數可能返回任何int值(即內存中的垃圾),並且該行為是undefined 即使編譯器允許運行它,也不應依賴於此。

我很確定您在編譯程序時看到了警告。 在我的環境中(在Mac OSX上為g ++),編譯器發出以下警告:

警告:控制可能會達到非無效功能的結束[-Wreturn-type]

就個人而言,我認為編譯器沒有充分的理由允許這種錯誤(即,它應該無法編譯)。

參考:以下是類似的問題:

沒有返回語句的C ++返回值

暫無
暫無

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

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