作者:
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; 程式也是正常的
為何會這樣呢?
謝謝各位!
你試試看 sum = 那行後面加上其他程式碼實驗看看像是隨便 printf("hello");
這是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吧?
我想編譯器最後是處理加法,使用到 eax 儲存 sum剛好回傳值也是讀 eax 暫存器,所以答案會對
我記得會有novoid function reach...的warning
語言都已經提供抽象化了,為什麼還是有人愛用特定編譯器實作反過來解釋呢?暫存器那位
原 PO 問什麼在 "這個狀況" 下會剛好對,就猜測可能原因啊。如果問 "這樣寫可能有問題, 怎麼改比較好?" 就會給建議
作者: cysppol (PPOL) 2014-06-16 23:21:00
這情況是uninitial memory read,可以正常執行,但是回傳值未知。
作者: longlongint (華哥爾) 2014-07-04 10:12:00
沒寫return通常是傳0或是傳eax吧