尽管preincrement在此代码中有效,但为什么post增量运算符不起作用?

时间:2012-10-01 05:21:04

标签: 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:如果这是一个微不足道或愚蠢的问题,请原谅我,但我坚持这一点,我认为这是我寻求帮助的最佳地点。

2 个答案:

答案 0 :(得分:4)

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,它会在堆栈中重新打印所有这些值。

如果你在printf ("before: %d\n", x)语句之前添加了if,那么你会看到很多20行输出到屏幕上。

答案 1 :(得分:1)

x--使用旧的x值(减量前)调用该函数。因此,您将获得无限递归,并使用相同的值调用自身。 --x用x的新(递减)值调用函数,因此最终命中x> 0条件。

另一种调查方法是执行以下操作:

int a, b;
a = b = 1;

printf("--a: %d b--: %d\n", --a, b--); // Output is --a: 0 b--: 1