Непонятная ситуация с C ++ - PullRequest
       9

Непонятная ситуация с C ++

0 голосов
/ 29 августа 2011

Это действительно глупый вопрос, но мне нужна небольшая уверенность / помощь. У меня текущая «рекурсивная» ситуация:

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

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

У меня вопрос, будет ли переменная acc в конечном итоге установлена ​​на ноль. Должно, верно? Даже если условие не выполняется во второй раз (после рекурсии). Он просто завершит выполнение функции и продолжит установку acc в 0 .. Я думаю / надеюсь?

Спасибо!

РЕДАКТИРОВАТЬ: Я не публикую полный код, потому что я не думаю, что это необходимо. Это немного долго. Стоит отметить, что condition не всегда верно. Следовательно, эта рекурсия не бесконечна.

РЕДАКТИРОВАТЬ 2: Максимальное количество рекурсий равно 2. То есть, если условие выполняется в первый раз, во второй раз оно будет иметь значение false (после рекурсии), избегая бесконечного цикла. Чтобы прояснить мой вопрос: рассмотрим ситуацию, когда условие вначале дает результат, так что рекурсия происходит. После того, как функция завершится (результат будет ложным во время рекурсии) и завершится, она вернется к исходной функции, и она также завершится. После выхода продолжится ли он там, где остановился, то есть установил acc = 0, а затем вернулся? Один из ответов ниже дал хорошее объяснение этому.

Ответы [ 4 ]

4 голосов
/ 30 августа 2011

Предполагая, что рекурсивный вызов 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 в этом конкретном рекурсивном вызове не зависит от значения acc в других рекурсивных вызовах.

Надеюсь, это поможет!

2 голосов
/ 30 августа 2011

Если условие ложно с самого начала, acc не будет установлен на ноль. Иначе да, будет.

Таким образом, единственное, что будет влиять на то, установлено ли значение acc на ноль, это значение условия в первый раз.

0 голосов
/ 30 августа 2011

Как уже говорили другие, если 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, а затем вернется?

Да.

0 голосов
/ 30 августа 2011

Да, функции возвращаются сразу после вызова точки, поэтому ваш acc будет установлен в 0.

Обратите внимание, что если он глобальный, он будет многократно установлен на 0, когда вы возвращаетесь из рекурсии, а если он локальный, и это конец вашей функции, он может ничего не делать (читай, он будет оптимизирован вашим компилятором).

...