int reverse(int);
void main()
{
int no =5;
reverse(no);
}
int reverse(int no)
{
if(no == 0)
return 0;
else
printf("%d",no);
reverse(no--);
}
这个程序进入了无限循环。为什么会这样?我无法得到期望的输出。期望的输出应该是5 4 3 2 1。谢谢。
reverse(no--);
您正在传递no--
的值。由于这使用后缀--运算符,这意味着“递减no
,然后将no
的原始值传递到对reverse
的递归调用中。” 这会导致无限递归,因为您不断地使用reverse
相同的值进行递归调用。
为了解决此问题,请更改为如下:
reverse(no - 1);
注意这里没有必要对no
进行递减操作,因为在当前的递归调用中,您不会再次读取no
的值。您可以将no - 1
的值直接传递给函数。实际上,通常应避免在递归调用中使用--
,因为这几乎总是代码错误的标志。no
上使用了后减运算符。这首先获取 no
的值,并将其用作表达式的值,然后再递减 no
(仍使用未递减的值作为表达式的值)。你可能想要使用 --no
,甚至只是 no - 1
。(前者将修改 no
,而后者不会,但由于在该点之后没有引用 no
,因此并不重要。)no
永远不会再次被读取,并且使用减量操作可能意味着 OP 误解了在每个函数调用中 no
是一个不同的变量。 - templatetypedef更改:
reverse(no--);
至:
reverse(no-1);
no--
返回递减发生之前的原始值。所以这行代码将一直调用 reverse(5)
。因此,造成了无限循环。
你正在使用后减操作符。先计算值,然后减少。
将此改为:
reverse(no--);
转换为:
return reverse(--no);
--no 是预减。先减少“no”,然后将值传递给反转。
请注意,我正在返回结果值,您的函数必须始终返回一个int,因为它的声明如此。
n--
是后置递减运算符,它首先将 n 作为函数参数使用,然后再将 n 减一。
因此,n--
的本质是
reverse(n);
n = n - 1;
--n
。你想要做什么
int reverse(int);
int main()
{
int no =5;
reverse(no);
}
int reverse(int no)
{
if(no == 0)
return 0;
else
printf("%d",no);
return reverse(--no);
}
这样每次调用reverse时,您都会返回一个数字,并在使用它之前对其进行递减。
int main()
。void main
是不可移植的,在所有编译器上都无法工作。 - hugomg