我对编程真的很陌生(我是一名电子和通信工程师),我无法弄清楚为什么一个程序可以工作而另一个程序不能。
在进一步学习之前,我想很好地理解递归函数。我将不胜感激任何有关此事的帮助。
我知道 x++ 和 --x 之间的区别。但在这个程序的上下文中,我认为这两个程序应该以相同的方式运行。但他们没有。
void rec(int x)
{
if(x>0)
rec(x--);
printf("%d",x);
}
int main()
{
rec(4);
_getch();
} /*This doesn't work. And shows a stackoverflow */
void rec(int x)
{
if(x>0)
rec(--x);
printf("%d",x);
}
int main()
{
rec(4);
_getch();
} /*This gives a proper output as expected*/
/*The output is 00123*/
谢谢!
P.S:如果这是一个微不足道或愚蠢的问题,请原谅我,但我被困在这个问题上,我认为这是我可以寻求帮助的最佳地方。
最佳答案
void rec(int x) {
if (x>0)
rec(x--);
printf("%d",x);
}
这将永远递归(或者至少直到你耗尽堆栈空间)。 x--
表示使用 x
的当前值,然后然后递减它。
换句话说,让我们使用参数 20 调用 rec
。它大于零,因此它将依次使用当前值 20 再次调用 rec
然后递减x
(但实际上在调用返回之后。
因此,您永远会使用值 20 来调用 rec
,这就是您耗尽堆栈的原因。
如果将 x--
更改为 --x
,则在将 x
传递给函数,因此它将进入 20, 19, 18, ... 1, 0
,此时它将运行回堆栈并打印所有这些值。
如果您在 if
语句之前放置 printf ("before: %d\n", x)
,您会看到很多 20
行输出到屏幕。
关于c - 尽管预增量在这段代码中可以工作,但为什么后增量运算符不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57014529/