【问题标题】:Why does post increment operator not work although preincrement does work in this code?为什么尽管预增量在此代码中有效,但后增量运算符不起作用?
【发布时间】:2012-10-01 05:21:04
【问题描述】:

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

在继续学习之前,我想对递归函数有一个很好的了解。我将不胜感激有关此的任何帮助。

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

谢谢!

PS:如果这是一个微不足道或愚蠢的问题,请原谅我,但我被困在这个问题上,我认为这是我可以寻求帮助的最佳地点。

【问题讨论】:

  • 您确实应该在编译时启用警告和调试信息(例如,在 Linux 上使用 gcc -Wall -g 进行编译),并且您应该学习使用调试器(例如,在 Linux 上使用 gdb),尤其是 step-逐步执行和显示数据。
  • 我目前正在使用 MS Visual Studio(我曾经使用 Turbo C++)。几周前我开始编程。在那之前我读过一点。我认为Visual Studio中应该有一个调试工具,但我还没有弄清楚在哪里。但感谢您的输入。我使用这个工具是因为我的大学将它用于教学目的。
  • '我知道 x++ 和 --x 之间的区别' -- 不。不应该假设自己知道自己试图理解的东西。

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


【解决方案1】:
void rec(int x) {
    if (x>0)
        rec(x--);
    printf("%d",x);
}

这将永远递归(或至少直到您耗尽堆栈空间)。 x-- 表示使用x当前值,然后然后递减它。

换句话说,让我们使用参数 20 调用 rec。它大于零,因此它会再次调用 rec,当前值为 20 然后递减 x (但实际上调用返回之后。

因此,您将永远以 20 的值调用 rec,这就是为什么您会耗尽您的筹码。

如果您将x-- 更改为--x,它会在将x 递减 将其传递给函数,因此它将转到20, 19, 18, ... 1, 0,此时它将运行备份堆栈打印所有这些值。

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

【讨论】:

  • 虽然这肯定回答了这个问题,但我想说问题的根源在于 ++ 运算符与其他表达式混合是一种非常有效的创建错误的方法。代码 if(x>0){ x--; rec(x); } 本来可以正常工作的。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 2017-01-31
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    相关资源
    最近更新 更多