2016-10-05 48 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语句时,无论注册了哪些垃圾值,都会返回。