C++ 混淆C++;情况

C++ 混淆C++;情况,c++,recursion,C++,Recursion,这是一个非常愚蠢的问题,但我需要一些安慰/帮助。我有目前的“递归”情况: void add( int value ) { // do something ... // if ( condition ) { add(myVal); acc = 0; } } 我的问题是变量acc是否最终会设置为零。应该是吧?即使条件在第二次(递归时)不成立。它将完成该功能并继续将acc设置为0。。我想/希望 谢谢 编辑:我没有发布完整的代码,因为我认为这是不必要的。有点长。值得一提的

这是一个非常愚蠢的问题,但我需要一些安慰/帮助。我有目前的“递归”情况:

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

  if ( condition ) {
    add(myVal);
    acc = 0;
  }
}
我的问题是变量
acc
是否最终会设置为零。应该是吧?即使条件在第二次(递归时)不成立。它将完成该功能并继续将
acc
设置为0。。我想/希望

谢谢

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


编辑2:最大递归数为2。也就是说,如果条件第一次为true,那么第二次(递归时)将返回false,从而避免无限循环。为了澄清我的问题:考虑条件第一的结果是真实的情况,所以递归发生。函数完成(递归过程中的结果将为false)并退出后,它将退出到原始函数,该函数也将退出。退出时,它是否会继续其停止的位置,即设置acc=0,然后返回?下面的一个答案对此提供了很好的解释。

是的,函数在被调用后立即返回,因此您的
acc
将设置为0


请注意,如果它是全局的,当您从递归返回时,它将被多次设置为0,而如果它是局部的,并且这是函数的结尾,它可能不会做任何有用的事情(读取,它将由编译器进行优化)。

是的,函数在被调用后立即返回,因此,您的
acc
将设置为0


请注意,如果它是全局的,当您从递归返回时,它将被多次设置为0,而如果它是局部的,并且这就是函数的结尾,它可能不会做任何有用的事情(读取,它将由编译器优化)。

假设对
添加的递归调用返回,是的,首先进行递归调用的函数内部的
acc
值实际上将设置为零。您可以将代码想象为这样工作:

if ( condition ) {
  make a call to add(myVal);
  wait for that call to return;
  acc = 0;
}
void add( int value )
{
  int acc = 1;
  cout << acc << endl;

  if ( condition ) {
    add(myVal);
    acc = 0;
  }
}
不过,一个重要的细节是,假设函数中的
acc
是一个局部变量,那么它只会在调用函数中设置为零,而不会在您进行的递归调用中设置为零。例如,如果您的代码如下所示:

if ( condition ) {
  make a call to add(myVal);
  wait for that call to return;
  acc = 0;
}
void add( int value )
{
  int acc = 1;
  cout << acc << endl;

  if ( condition ) {
    add(myVal);
    acc = 0;
  }
}
void add(int值)
{
int acc=1;

cout假设对
add
的递归调用返回,是的,首先进行递归调用的函数内部的
acc
值将确实设置为零。您可以认为代码的工作方式如下:

if ( condition ) {
  make a call to add(myVal);
  wait for that call to return;
  acc = 0;
}
void add( int value )
{
  int acc = 1;
  cout << acc << endl;

  if ( condition ) {
    add(myVal);
    acc = 0;
  }
}
不过,一个重要的细节是,假设函数中的
acc
是一个局部变量,则它只会在调用函数中设置为零,而不会在您进行的递归调用中设置为零。例如,如果您的代码如下所示:

if ( condition ) {
  make a call to add(myVal);
  wait for that call to return;
  acc = 0;
}
void add( int value )
{
  int acc = 1;
  cout << acc << endl;

  if ( condition ) {
    add(myVal);
    acc = 0;
  }
}
void add(int值)
{
int acc=1;

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


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

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


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

正如其他人所说,如果acc是本地的,这不起任何作用,如果acc不是本地的,这是多余的。此外,如果第一次调用时条件为false,则无法保证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,然后返回


是。

正如其他人所说,如果acc是本地的,则不会执行任何操作,如果acc不是本地的,则这是冗余的。此外,如果第一次调用时条件为false,则无法保证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,然后返回



是的。

我根本看不到任何影响
条件的代码。请发布真实的代码。最好是一个完整的、最低限度的工作示例。条件是如何受到影响的?为什么您希望与第一次调用时有所不同。您的代码实在太不完整,无法对其进行详细说明。您还没有告诉/向我们展示什么(如果有)设置
条件
(或在什么情况下),myVal有什么价值,等等。不知道这些事情,你的问题就无法回答。今天有人有很多多余的名誉要浪费。我根本没有看到任何影响条件的代码。请发布真实的代码。最好是一个完整的、最小的、有效的示例。条件是如何受到影响的?你为什么要花钱ct与您第一次调用它时不同。您的代码确实太不完整,无法详细说明。您没有告诉/向我们展示设置
条件的内容(如果有的话)
(或者在什么情况下),myVal的值是多少,等等。不知道这些事情,你的问题就无法回答。今天有人有很多多余的名誉要浪费。太好了。这正是我想听到的。+1如果第一次检查的条件为假,他的代码和你的代码都不会设置acc为0。@Mooning Duck-为什么?可能是条件ion涉及随机性、用户输入、参数或其他因调用而异的值。事实上,OP保证了这一点。这意味着,如果它第一次为false,并不一定意味着它总是为false。大多数递归函数都是这样工作的。@templatetypedef:您似乎误解了我。My com你的回答是正确的,前提是