令人困惑的C ++情况

时间:2011-08-29 19:57:27

标签: c++ recursion

这是一个非常愚蠢的问题,但我需要一点保证/帮助。我有当前的“递归”情况:

void add( int value )
{
  // do something ... //

  if ( condition ) {
    add(myVal);
    acc = 0;
  }
}

我的问题是变量acc最终是否会设置为零。它应该,对吗?即使第二次(在递归时)条件不成立也是如此。它将完成执行该功能并继续将acc设置为0 ..我想/希望?

谢谢!

编辑:我没有发布完整的代码,因为我认为没有必要。这有点冗长。值得一提的是condition并非总是如此。因此,这种递归不是无限的。

编辑2:最大递归是2.也就是说,如果条件第一次成立,它将在第二次(递归时)结果为假,避免无限循环。澄清我的问题:考虑条件首先结果为真的情况,因此递归发生。函数完成后(在递归期间结果将为false)并退出,它将退出到原始函数,并且也将退出。退出后,它会在中断的地方继续,即设置acc = 0然后返回吗?下面的答案之一为此提供了一个很好的解释。

4 个答案:

答案 0 :(得分:4)

假设对add的递归调用返回,是的,在第一个位置进行递归调用的函数内的acc的值确实将被设置为零。你可以认为代码是这样的:

if ( condition ) {
  make a call to add(myVal);
  wait for that call to return;
  acc = 0;
}

一个重要的细节是,假设acc是函数中的局部变量,它只会在调用函数中设置为零,而不是递归调用你做了例如,如果您的代码如下所示:

void add( int value )
{
  int acc = 1;
  cout << acc << endl;

  if ( condition ) {
    add(myVal);
    acc = 0;
  }
}

然后,如果您确实进行了指示的递归调用,递归调用中cout语句的输出仍为1,因为此特定递归中acc的值call在其他递归调用中独立于acc的值。

希望这有帮助!

答案 1 :(得分:2)

如果条件从一开始就为假,则acc不会设置为零。否则,是的。

因此,唯一影响acc get是否设置为零的因素是条件值第一次。

答案 2 :(得分:0)

是的,函数在调用它们之后立即返回,因此acc将设置为0.

请注意,如果它是全局的,当你从递归返回时,它将被反复设置为0,而如果它是本地的,那么这是函数的结束,它可能没有做任何有用的事情(阅读,它会被编译器优化出来。)

答案 3 :(得分:-2)

正如其他人所说,如果acc是本地的,那么什么都不做,如果acc不是本地的,这是多余的。此外,如果第一次调用条件为假,则无法保证acc将被设置为零。你可能想要这个:

void add( int value )
{
  // do something ... //    
  if ( condition ) {
    add(myVal); //if condition is true, recurse.
  } else {
    acc = 0; //else, set acc to zero once and escape all the recursion
  }
}
  

退出后,是否会继续停止,即设置acc = 0然后返回?