2016-10-05 8 views
0

このコードでは、elseで実行されたコードとブロック後に実行されたコードの違いは何ですか?elseブロック内のコードの実行とその後のブロック

#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;をelseブロックに入れると、それは動作する。なぜそうなのか?

+2

適切なツールは、あなたのデバッガであると言うべきです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。少なくとも、問題を再現する[最小、完全、および検証可能](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

あなたが上記のいずれかを使用して、問題が他のブロック(return文で他を保持しない場合は、この

counter=digits(number, value , counter); 

のような数字関数呼び出しで再帰を使用して呼び出すときに、上記のコードに問題があります)はコールスタックで一度だけ実行され、一番上の関数呼び出しスタックはカウンタをメイン関数に直接返し、結果を正しく取得しますが、これは良いコーディング方法ではありません。

1

わかりません「このコードは機能しません」と言ったら何を意味するのですか?...しかし、あなたのdigits(int, int, int)メソッドは常に後退しますn a 1(上記のコードで提供されます。あなたは上記の後に他のブロックを持つようにコードを変更した場合は...

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

... 

を: exは:digits(number, 10, 0);

これは設定再帰があなたの現在のコードで動作方法の事実によるものですifブロックすると、ifブロックにもリターンがあると想像してください。そのコードは、おそらくこのように見えた:コードで

... 

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

... 

があれば、他のブロックでreturnステートメントを持っているあなたの再帰セットは、それが最終的に他のブロックをヒットするために働き、あなたの蓄積カウンターを返します(これは動作しますあなたは整数の除算を行い、int result = number/value;のような小数値を切り捨てているので、これはvalueパラメータの値を10増加させるためです)...これは、このコードはかなり脆いです。 numberパラメーターの数値にオーバーフロー例外が発生します。

0

それだけでなく、あなたが次のように試してみると、奇妙な答えが出るかもしれません。 elseの部分はまだそこにあることに注意してください。

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

ブロックを次のように置き換えると、常に正しい答えが得られます。

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

なぜですか?

intの値は返されていないため、これは起こっています。

関数の呼び出し元は、何らかのメカニズムによって戻り値を読み込みます。この特定の場合、戻り値はタイプintであり、戻り値を読み取る最も可能な方法はレジスタを介して行われます。 return文を含まない場合は、登録されているガベージ値が返されますが、返されます。

関連する問題