2016-10-05 31 views
0

在這段代碼,我想知道是什麼之後,如果塊執行的代碼中的其他執行和代碼之間的區別?執行的其他塊碼後,如果塊

#include <iostream> 
using namespace std; 

int digits(int number, int value, int times){ 
    int counter = times; 
    counter++; 
    int result = number/value; 
    value=value*10; 
    if (result != 0){ 
     digits(number,value,counter); 
    } 
    return counter; 
} 

int main() { 
    int number,no_of_digit; 
    cout << "Enter the number : "; 
    cin >> number; 
    no_of_digit = digits(number, 10, 0); 
    cout << "No of digits are : " << no_of_digit << "\n"; 
    return 0; 
} 

此代碼無法正常工作。它給出值1. 但是,如果我把return counter;在其他塊它的作品。爲什麼這樣?

+2

使用正確的工具來解決這些問題是你的調試器。您應該先詢問Stack Overflow,然後逐行執行代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,你應該[編輯]你的問題,以包含一個[Minimal,Complete,and Verifiable](http://stackoverflow.com/help/mcve)例子來重現你的問題,以及你在調試器中所做的觀察。 –

回答

0

被您忽略的數字函數的返回值

int counter = times; 
counter++; 
int result = number/value; 
value=value*10; 
if (result != 0){ 
    digits(number,value,counter); 
} 
return counter; 

應該說

int counter = times; 
counter++; 
int result = number/value; 
value=value*10; 
if (result != 0){ 
    return digits(number,value,counter); 
} 
return counter; 
1

與上面的代碼的問題是使用遞歸的數字函數調用這樣

counter=digits(number, value , counter); 

,如果你不使用上面一個,並保持一個else問題是else塊(return語句調用時)將在調用堆棧只有一次被執行,最上面的函數調用堆棧將直接返回櫃檯的主要功能,並會正確地得到結果,這是不是編碼

1

的一個很好的方式,我通過我不知道當你說「這段代碼不起作用」時,你的意思是......但它看起來像你的digits(int, int, int)方法總是會返回n 1(使用上面提供的代碼。 例如:digits(number, 10, 0);

這是由於遞歸在當前的代碼的工作方式的事實成立: ...

if (result != 0){ 
    digits(number,value,counter); //recursion happens here and returns an int value to nothing. 
} 
return counter; 

... 

如果你改變了代碼有上述後else塊如果,那麼我想你在if塊中也有回報(因爲你必須)。所以代碼可能是這樣的:

... 

if (result != 0){ 
    return digits(number,value,counter); 
} 
else { 
    return counter; 
} 

... 

的代碼在if和else塊你的遞歸集將工作,因爲它最終將打擊else塊,並返回您的累計計數器(這將工作return語句因爲你正在做的整數除法和截斷這樣int result = number/value;十進制值。而這個作品,因爲你增加10 value參數的值)......他這樣說,這個代碼是相當脆弱,如果使用了足夠大編號爲number參數,你會得到一個溢出異常。

0

不僅如此,如果您嘗試以下,你可能會得到一些奇怪的答案。請注意,else部分仍然存在。

if (result != 0) { 
    int i = digits(number, value, counter); 
    cout << i; 
} else { 
    return counter; 
} 

只要用下面的代碼替換你的if塊,它總會給你正確的答案。

if (result != 0) { 
    return digits(number, value, counter); 
} else { 
    return counter; 
} 

爲什麼?

這是因爲你沒有返回int價值,你應該這樣做。

功能的來電會通過某種機制來讀返回值。在這種特定情況下,返回值類型爲int,讀取返回值的最可能方式是通過寄存器。當你不包含return語句時,無論註冊了哪些垃圾值,都會返回。