[英]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;
}
第二段代碼不正確,您認為不重要的警告可能類似於:
警告:控制到達非無效功能的結尾
您必須在所有路徑中提供返回值,否則(當num
為1
)是未定義的行為,沒有默認的返回值 ( main
除外)。
這是未定義的行為,這意味着結果完全取決於特定的編譯器。 因此,我認為您應該避免這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.