在else块中执行代码,在if块之后执行

时间:2016-10-05 04:24:52

标签: c++

在这段代码中,我想知道在else中执行的代码和if之后执行的代码之间有什么区别?

#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块中就行了。为什么这样?

4 个答案:

答案 0 :(得分:1)

上面代码的问题是在数字函数调用中使用递归调用时这样

counter=digits(number, value , counter);

如果你不使用上面的那个并保留一个else问题是else块(return语句)将只在调用堆栈中执行一次,而最顶层的函数调用堆栈将把计数器直接返回到你的main函数并将正确获得结果,这不是一个好的编码方式

答案 1 :(得分:1)

当您说“此代码不起作用”时,我不确定您的意思。...但看起来您的digits(int, int, int)方法将始终返回1(使用上面提供的代码。 例如:digits(number, 10, 0);

这是因为递归在你当前的代码设置中起作用的方式:     ...

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

...

如果您在上面的if之后将代码更改为具有else块,那么我想你在if块中也有一个返回(因为你必须这样做)。所以代码可能看起来像这样:

...

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

...

代码在if和else块中有一个return语句,你的递归集将起作用,因为它最终将命中else块并返回你的累积计数器(这样可以工作,因为你正在进行整数除法并截断十进制值就像这个int result = number/value;。这是有效的,因为你将value参数的值增加了10)...据说,如果你为{使用足够大的数字,这段代码非常脆弱{1}}参数,您将收到溢出异常。

答案 2 :(得分: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语句时,无论寄存器有什么垃圾值,都会被返回。

答案 3 :(得分: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;