错误:添加显式括号以避免悬空else。C

8

我正在使用gedit,我的编译器是clang。 最近我遇到了一些错误,不确定如何解决(标题中的错误并且涉及else语句)。

 if(isupper(ptext[i]))
            if ((((ptext[i]+k)%26)+52) < 65 || (((ptext[i]+k)%26)+52) > 90)
            {
                printf("%c", (((ptext[i]+k)%26)+78));
            }
            else
            {
                printf("%c", (((ptext[i]+k)%26)+52));
            }

我该添加/删除/修复什么?感谢您的提前帮助。

就像编译器告诉你的那样:添加一些 {} 以使你的意图更清晰。 - John3136
5
请注意:这实际上不是一个错误,您可能正在使用编译器开关,将一些信息性消息转换为错误。 - M.M
1
为了提高代码的可读性,使用符号常量,例如使用'A'代替65等。 - M.M
我不明白编译器的信息有什么歧义或不清楚之处。你考虑过遵循它的建议吗? - Lightness Races in Orbit
你可以使用 -Wno-dangling-elsegcc 中隐藏这个警告。 - Kröw
2个回答

11

你外层的if语句缺少大括号:

if(isupper(ptext[i]))
{
        if ((((ptext[i]+k)%26)+52) < 65 || (((ptext[i]+k)%26)+52) > 90)
        {
            printf("%c", (((ptext[i]+k)%26)+78));
        }
        else
        {
            printf("%c", (((ptext[i]+k)%26)+52));
        }
}

个人而言,我会将一些常见的元素提取为变量:

char something1 = ptext[i];
if(isupper(something1))
{
    char something2 = (something1+k)%26;
    if ((something2+52) < 65 || (something2+52) > 90)
    {
        printf("%c", (something2+78));
    }
    else
    {
        printf("%c", (something2+52));
    }
}

甚至可以加入一个char something3 = something2 + 52;。当然,使用更有意义的变量名。


3
注意,该消息是一个建议,而不是实际上的错误。 - user253751

5

C语言不像Python一样通过缩进来指示哪些代码块属于哪个部分。因为在C语言中,所有的空格都会被忽略。

你需要使用大括号告诉编译器else语句属于哪个if语句。

C编译器并不知道这一点,所以它要求你明确指定:

是这样吗?

 if(isupper(ptext[i]))
 {
            if ((((ptext[i]+k)%26)+52) < 65 || (((ptext[i]+k)%26)+52) > 90)
            {
                printf("%c", (((ptext[i]+k)%26)+78));
            }
            else
            {
                printf("%c", (((ptext[i]+k)%26)+52));
            }
 }

还是这个?

 if(isupper(ptext[i]))
 {
            if ((((ptext[i]+k)%26)+52) < 65 || (((ptext[i]+k)%26)+52) > 90)
            {
                printf("%c", (((ptext[i]+k)%26)+78));
            }
 }
 else
 {
            printf("%c", (((ptext[i]+k)%26)+52));
 }

这是一个“悬挂”else的示例。

6
C编译器是知道的(它是第一个),只是程序员可能会出错。;) - Lightness Races in Orbit
4
编译器能够理解C标准,并将else与最近的没有elseif配对(因此代码无歧义地是第一个版本)。但是,用户可能打算使用第二个版本,这可能是用户(程序员)思维上的歧义。 - Jonathan Leffler
我猜我作为程序员被歧义搞糊涂了。这就是为什么我从不在多行if语句中使用大括号! - Jeremiah Dicharry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接