c - 尽管预增量在这段代码中可以工作,但为什么后增量运算符不起作用?

标签 c stack-overflow post-increment pre-increment

我对编程真的很陌生(我是一名电子和通信工程师),我无法弄清楚为什么一个程序可以工作而另一个程序不能。

在进一步学习之前,我想很好地理解递归函数。我将不胜感激任何有关此事的帮助。

我知道 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/

相关文章:

c - 调度算法cpu时间

java - Libgdx JsonWriter StackOverflowError 错误

java - 是否有 x++ 的等价物可用于表达式中以大于 1 的值递增?

c - 为什么 while 循环中 '*s-*t"的结果是 "67"?

java - 为什么这里忽略了这个 Java 运算符优先级?

检查C中的输入流是否为空

c - 面向 C/C++ 开发人员的 Eclipse IDE : breakpoints not working

c - Strcmp 给出段错误

c# - 具有后备属性的 setter 中的 StackOverflowException

c# - x64 和 x32 中的不同行为展开堆栈