C++"添加显式括号以避免悬空"

王小泉*_*王小泉 0 c++ recursion palindrome

bool isPalindromeIterative(const char *s1){

int len=strlen(s1)-1;

if(len>0)
    if(s1[0]==s1[len]){
        len-=2;
        isPalindromeIterative(s1+1);
    }
    else

        return false;

return true;
}
Run Code Online (Sandbox Code Playgroud)

我正在写关于Palindrome的文章.当我运行它时,它会出现如下警告:

":79:13:警告:添加明确的括号以避免悬挂其他[-Wdangling-else]"

请帮我 !谢谢!

R S*_*ahu 6

当你写作时,

if(len>0)
    if(s1[0]==s1[len]){

        // This has no effect on the recursive call.
        len-=2;

        // You missed the return in your post.
        return isPalindromeIterative(s1+1);
    }
    else
        return false;
Run Code Online (Sandbox Code Playgroud)

您很可能打算将 theelse与第二个关联起来if

if(len>0)
{
    if(s1[0]==s1[len])
    {
        return isPalindromeIterative(s1+1);
    }
    else
        return false;
}
Run Code Online (Sandbox Code Playgroud)

但是,编译器不使用缩进来解决这个问题。从编译器编写者的角度来看,您可能打算将else与第一个相关联if

if(len>0)
{
    if(s1[0]==s1[len])
    {
        return isPalindromeIterative(s1+1);
    }
}
else
{
   return false;
}
Run Code Online (Sandbox Code Playgroud)

由于这是开发人员常犯的错误,因此编译器会向您发出警告,并希望您更新代码,以便它不太可能变成运行时错误。


我想指出的是,您用来检测字符串是否是回文的递归逻辑是错误的。

假设您的字符串是“abxba”。

在第一次迭代中,您'a'与进行比较'a'
在下一次迭代中,您'b'与进行比较'a',这是不正确的。你最终会得到错误的答案。

你必须稍微改变你的策略。使用:

bool isPalindromeIterative(const char *s1, int start, int end)
{
   if ( start >= end )
   {
      return true;
   }

   if ( s1[start] == s1[end] )
   {
      return isPalindromeIterative(s1, start+1, end-1)
   }

   return false;
}
Run Code Online (Sandbox Code Playgroud)

迭代调用的开始必须如下所示:

isPalindromeIterative(s1, 0, strlen(s1)-1);
Run Code Online (Sandbox Code Playgroud)


Bo *_*son 5

代码正式没有任何问题,除非您希望else匹配外部代码if.一个常见的错误.

如果你在任何地方添加大括号,你会明白你的意图:

if(len>0)
{
    if(s1[0]==s1[len])
    {
        len-=2;
        isPalindromeIterative(s1+1);
    }
    else
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)