C++ 为什么删除这个return语句会影响整个递归函数的结果?

C++ 为什么删除这个return语句会影响整个递归函数的结果?,c++,string,function,recursion,palindrome,C++,String,Function,Recursion,Palindrome,我正在使用递归编写回文检查器。 我搞不懂为什么要移除 return true 函数末尾的语句会影响返回值 int firstChar = 0; int lastChar = 0; // These two variables are used to transverse the string from both ends // eventually meeting 代码#1: 对于所有回文,它返回true,对于所有非回文,它返回false 代码#2: 对于部分回文,该值返回true;对于所

我正在使用递归编写回文检查器。 我搞不懂为什么要移除

return true
函数末尾的语句会影响返回值

int firstChar = 0;
int lastChar = 0;
// These two variables are used to transverse the string from both ends 
// eventually meeting
代码#1:

对于所有回文,它返回true,对于所有非回文,它返回false

代码#2:

对于部分回文,该值返回true;对于所有非回文,该值返回false

回文,例如


Amanaplana对于初学者来说,该功能在任何情况下都是不正确的。例如,对于字符串
“1231”
,函数返回
true
。我希望你能亲自检查一下

这部分功能

if (tempCleanText.at(firstChar) == tempCleanText.at(lastChar))
{
    palindromeCheck(tempCleanText, ++firstChar, --lastChar);
}
else
{
    return false;
}

return true;    // Keeping this in works
应至少替换为以下代码段

if (tempCleanText.at(firstChar) == tempCleanText.at(lastChar))
{
    return palindromeCheck(tempCleanText, ++firstChar, --lastChar);
}
else
{
    return false;
}
这就是返回语句

return true;    // Keeping this in works
应完全移除

至于你的问题,如果没有最后一个return语句,函数将有未定义的行为,因为它在if语句之后不返回任何内容。这就是if语句

if (tempCleanText.at(firstChar) == tempCleanText.at(lastChar))
{
    palindromeCheck(tempCleanText, ++firstChar, --lastChar);
}
else
{
    return false;
}
已成功执行,前提是

tempCleanText.at(firstChar) == tempCleanText.at(lastChar))
在执行if语句的sub语句之后,函数返回什么?没什么!:)

此外,除了字符串本身之外,声明两个附加参数(索引)也没有意义,因为在任何情况下,字符串都是按值传递的,您总是可以通过调用成员函数
size()
来获取其大小

我可以建议如下函数实现,类似于您的函数。如果传递空字符串,此函数实现将返回true

#include <iostream>
#include <iomanip>
#include <string>
#include <cctype>

bool palindromeCheck( std::string s )
{
    if ( s.size() < 2 )
    {
        return true;
    }
    else if ( ispunct( ( unsigned char )s.front() ) || isspace( ( unsigned char )s.front() ) )
    {
        return palindromeCheck( s.substr( 1 ) );
    }
    else if ( ispunct( ( unsigned char )s.back() ) || isspace( ( unsigned char )s.back() ) )
    {
        return palindromeCheck( s.substr( 0, s.size() - 1 ) );
    }
    else if ( s.front() == s.back() )
    {
        return s.size() == 2 ? true : palindromeCheck( s.substr( 1, s.size() - 2) ); 
    }
    else
    {
        return false;
    }
}

int main() 
{
    std::cout << std::boolalpha << palindromeCheck( "" ) << '\n';
    std::cout << std::boolalpha << palindromeCheck( "1" ) << '\n';
    std::cout << std::boolalpha << palindromeCheck( "1 1" ) << '\n';
    std::cout << std::boolalpha << palindromeCheck( "1,2,2,1" ) << '\n';
    std::cout << std::boolalpha << palindromeCheck( "1 2 3 2 1" ) << '\n';
    std::cout << std::boolalpha << palindromeCheck( "12341" ) << '\n';

    return 0;
}

对于初学者来说,该功能在任何情况下都是不正确的。例如,对于字符串
“1231”
,函数返回
true
。我希望你能亲自检查一下

这部分功能

if (tempCleanText.at(firstChar) == tempCleanText.at(lastChar))
{
    palindromeCheck(tempCleanText, ++firstChar, --lastChar);
}
else
{
    return false;
}

return true;    // Keeping this in works
应至少替换为以下代码段

if (tempCleanText.at(firstChar) == tempCleanText.at(lastChar))
{
    return palindromeCheck(tempCleanText, ++firstChar, --lastChar);
}
else
{
    return false;
}
这就是返回语句

return true;    // Keeping this in works
应完全移除

至于你的问题,如果没有最后一个return语句,函数将有未定义的行为,因为它在if语句之后不返回任何内容。这就是if语句

if (tempCleanText.at(firstChar) == tempCleanText.at(lastChar))
{
    palindromeCheck(tempCleanText, ++firstChar, --lastChar);
}
else
{
    return false;
}
已成功执行,前提是

tempCleanText.at(firstChar) == tempCleanText.at(lastChar))
在执行if语句的sub语句之后,函数返回什么?没什么!:)

此外,除了字符串本身之外,声明两个附加参数(索引)也没有意义,因为在任何情况下,字符串都是按值传递的,您总是可以通过调用成员函数
size()
来获取其大小

我可以建议如下函数实现,类似于您的函数。如果传递空字符串,此函数实现将返回true

#include <iostream>
#include <iomanip>
#include <string>
#include <cctype>

bool palindromeCheck( std::string s )
{
    if ( s.size() < 2 )
    {
        return true;
    }
    else if ( ispunct( ( unsigned char )s.front() ) || isspace( ( unsigned char )s.front() ) )
    {
        return palindromeCheck( s.substr( 1 ) );
    }
    else if ( ispunct( ( unsigned char )s.back() ) || isspace( ( unsigned char )s.back() ) )
    {
        return palindromeCheck( s.substr( 0, s.size() - 1 ) );
    }
    else if ( s.front() == s.back() )
    {
        return s.size() == 2 ? true : palindromeCheck( s.substr( 1, s.size() - 2) ); 
    }
    else
    {
        return false;
    }
}

int main() 
{
    std::cout << std::boolalpha << palindromeCheck( "" ) << '\n';
    std::cout << std::boolalpha << palindromeCheck( "1" ) << '\n';
    std::cout << std::boolalpha << palindromeCheck( "1 1" ) << '\n';
    std::cout << std::boolalpha << palindromeCheck( "1,2,2,1" ) << '\n';
    std::cout << std::boolalpha << palindromeCheck( "1 2 3 2 1" ) << '\n';
    std::cout << std::boolalpha << palindromeCheck( "12341" ) << '\n';

    return 0;
}
可能是

// ...

if (tempCleanText.at(firstChar) == tempCleanText.at(lastChar))

{
   return palindromeCheck(tempCleanText, ++firstChar, --lastChar); 
}

else
    return false;
// ...
可能是

// ...

if (tempCleanText.at(firstChar) == tempCleanText.at(lastChar))

{
   return palindromeCheck(tempCleanText, ++firstChar, --lastChar); 
}

else
    return false;
// ...

从非void函数返回而不通过
return
关键字显式返回值会调用未定义的行为。根据C++规范,调用未定义行为的程序完全可以随便做任何事情,所有产生的奇怪错误都将被归咎于编写调用未定义行为的代码的程序员的脚。 在这种情况下,实际可能发生的情况是,当您的函数通过删除函数的结尾返回时(并且没有执行
return false
),存储函数返回值的位置永远不会被写入——这意味着,就调用代码而言,函数返回的值将等于函数返回时该位置上出现的任何值。该位置预先存在的值将是任意的,难以预测,因为它是关于程序如何执行的各种细节的结果,因此程序的行为也将是任意的,难以预测


解决方案是确保始终显式返回一个值;在编译器中启用警告将允许它通过警告您是否忘记在某些代码路径中返回值来帮助您完成该任务。

从非void函数返回而不通过
return
关键字显式返回值将调用未定义的行为。根据C++规范,调用未定义行为的程序完全可以随便做任何事情,所有产生的奇怪错误都将被归咎于编写调用未定义行为的代码的程序员的脚。 在这种情况下,实际可能发生的情况是,当您的函数通过删除函数的结尾返回时(并且没有执行
return false
),存储函数返回值的位置永远不会被写入——这意味着,就调用代码而言,函数返回的值将等于函数返回时该位置上出现的任何值。该位置预先存在的值将是任意的,难以预测,因为它是关于程序如何执行的各种细节的结果,因此程序的行为也将是任意的,难以预测


解决方案是确保始终显式返回一个值;在编译器中启用警告将允许它在您忘记在某些代码路径中返回值时向您发出警告,从而帮助您完成该任务。

bool palindromeCheck(string text,int firstChar,int lastChar)
承诺函数将返回
bool
。如果你违背了这个承诺,编译器可以。如果不返回合适的值,您永远不希望退出非
void
返回类型的函数。请启用编译器警告并在测试功能之前解决它们?
bool-palindromeCheck(字符串文本,int-firstChar,int-lastChar)
承诺函数将返回
bool
。如果你违背了这个承诺,编译器可以。您永远不希望退出带有非-