[問題] 沒return為何function會回傳值?

作者: bizza ( )   2014-06-15 22:02:11
使用 DevC++
輸入1234 得到1+2+3+4
#include <iostream>
#include <cstdlib>
using namespace std;
int Test(int);
int main() {
int a;
cout <<"Enter your number: ";
cin >>a;
cout <<"Answer is "<<Test(a)<<endl;
system("Pause");
return 0;
}
int Test(int b) {
int sum;
if (b/10 >=1) {
int c = b%10;
sum = c+Test(b/10);
}
else
return b;
//return sum;
}
我是用遞迴寫,用餘數的方式去各別取輸入的值
問題是,我在function裡並沒有實際回傳最後總和值sum
可是程式卻可正常執行無任何警告錯誤?
當然我最後加上 return sum; 程式也是正常的
為何會這樣呢?
謝謝各位!
作者: loveme00835 (髮箍)   2014-06-15 22:19:00
你試試看 sum = 那行後面加上其他程式碼實驗看看像是隨便 printf("hello");
作者: littleshan (我要加入劍道社!)   2014-06-15 22:30:00
這是undefined behavior (6.6.3p2)
作者: bizza ( )   2014-06-15 22:41:00
我在sum=後面那行隨便加了一個output 答案就錯了@@
作者: LPH66 (-6.2598534e+18f)   2014-06-15 23:01:00
對初學者只要知道是三樓那樣就好了 (所謂的未定義行為)不需要去探究為什麼它會正好是對的結果
作者: bibo9901 (function(){})()   2014-06-15 23:27:00
換新一點的編譯器 應該會有warning吧?
作者: PUTOUCHANG (自己的廢文自己發)   2014-06-16 01:34:00
我想編譯器最後是處理加法,使用到 eax 儲存 sum剛好回傳值也是讀 eax 暫存器,所以答案會對
作者: IhateOGC (我討厭)   2014-06-16 08:32:00
overflow?
作者: steve1012 (steve)   2014-06-16 09:32:00
我記得會有novoid function reach...的warning
作者: loveme00835 (髮箍)   2014-06-16 12:51:00
語言都已經提供抽象化了,為什麼還是有人愛用特定編譯器實作反過來解釋呢?暫存器那位
作者: PUTOUCHANG (自己的廢文自己發)   2014-06-16 20:02:00
原 PO 問什麼在 "這個狀況" 下會剛好對,就猜測可能原因啊。如果問 "這樣寫可能有問題, 怎麼改比較好?" 就會給建議
作者: cysppol (PPOL)   2014-06-16 23:21:00
這情況是uninitial memory read,可以正常執行,但是回傳值未知。
作者: longlongint (華哥爾)   2014-07-04 10:12:00
沒寫return通常是傳0或是傳eax吧

Links booklink

Contact Us: admin [ a t ] ucptt.com