C++ 为什么这个递归函数返回错误的值?

C++ 为什么这个递归函数返回错误的值?,c++,recursion,C++,Recursion,我继续在构建递归函数时遇到一个问题,其中返回的值与我期望它返回的值不同。我相当肯定它与函数的递归性质有关,但我不明白发生了什么 int foo(std::string, int = 0); int main() { std::string testString = "testing"; std::cout << foo(testString); } int foo(std::string givenString, int numberToReturn) { if (giv

我继续在构建递归函数时遇到一个问题,其中返回的值与我期望它返回的值不同。我相当肯定它与函数的递归性质有关,但我不明白发生了什么

int foo(std::string, int = 0);

int main() {
std::string testString = "testing";
std::cout << foo(testString);
}

int foo(std::string givenString, int numberToReturn) {
    if (givenString.length() == 0) {
        std::cout << "Number to return before actually returning: " << numberToReturn << "\n";
        return numberToReturn;
    }
    if (true) {
        numberToReturn++;
    }
    std::string newString = givenString.erase(0, 1);
    foo(newString, numberToReturn);
}
intfoo(std::string,int=0);
int main(){
std::string testString=“测试”;

std::cout您的函数必须始终以return结尾,如果不以return结尾,您的函数将返回一些随机的未初始化值

int foo( int x )
{
  if ( x == 0 )
  {
    return x;
  }
  foo(x-1);
}
大致相当于:

int foo( int x )
{
  if ( x == 0 )
  {
    return x;
  }
  foo(x-1);
  return someRandomValue();
}
你真正想要的是:

int foo( int x )
{
  if ( x == 0 )
  {
    return x;
  }
  return foo(x-1);
}

“为什么返回时数字会更改”什么返回?只有在
givenString.length()时才返回==0
为真-否则您将从函数结尾处掉下来而不返回任何内容,这是未定义的行为,请更改编译器设置以捕获警告并将所有警告视为错误。这将为您省去很多麻烦。它将捕获您现在遇到的问题。@Algardas对不起,但我不明白问题是。如果我不返回,函数会调用自己直到基本情况为真。你能详细说明一下吗?然后你什么也不返回。你认为
intf(intn){If(n==0)返回42;f(n-1);}
该怎么办?@PasserBy我认为它在n+1调用时会返回42,不是吗?因为这在这里似乎是可行的。这如何转化为我稍长的示例?不是。它不会“返回一些随机的未初始化值”,它被称为undefined Behavior,谢谢你的解释。我的印象是,只要递归结束时有一个返回(第n次调用)一切都很好,但似乎每次调用结束时我都需要返回。这似乎是一个很容易解决的问题,因为在您的示例中,您只返回函数调用,这很有意义。这听起来正确吗?@路人是的,根据标准,返回值未定义行为,但实际行为是真实的Grams是根据调用约定返回一些随机值,该值可能是当前存储在函数结果使用的寄存器中的值。我试图实际回答这个问题,而不是用standardese蒙蔽海报。不,你是在误导人们。声称任何与此不同的东西都是错误的误导。UB不是你在C++中忽略的东西。编译器也利用这个特定的UB,即使我们在谈论。practicalities@AlanBirtles.现在停止发布明显不正确的内容。