在这段代码中,我想知道在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块中就行了。为什么这样?
答案 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;