C 中 else 块与 if 块的关联

Ada*_*dey -4 c if-statement

我有一个代码片段,如下所示。有人可以解释一下为什么 else 块与嵌套的 if 块关联吗?以下代码片段的输出是1。我执行了代码,但无法理解为什么这些块按以下顺序关联。

更新:这是我在一家公司往年面试题中发现的一个问题。if我总是在我的和块周围使用括号else。我现在明白为什么整个块没有被执行。

谢谢大家的回复:)

int x=1, y=1;
if (y<0)
    if (y>0) x=3;
    else x=5;
printf("%d", x);
Run Code Online (Sandbox Code Playgroud)

Ted*_*gmo 6

通过适当的缩进,它会变得更加清晰:

    int x = 1, y = 1;

    if (y < 0)         // false, so it jumps directly here
        if (y > 0)     //                                |
            x = 3;     //                                |
        else           //                                |
            x = 5;     //                                |
    printf("%d", x);   // <------------------------------+
Run Code Online (Sandbox Code Playgroud)

添加大括号使其更加清晰。下面的内容与你的原始代码的含义完全相同:

    int x = 1, y = 1;

    if (y < 0) {
        if (y > 0) {
            x = 3;
        } else {
            x = 5;
        }
    }
    printf("%d", x);
Run Code Online (Sandbox Code Playgroud)

那是,if(condition) <statement> else <statement>。可以<statement>是单个语句,也可以是{}语句。如果没有大括号,则只会有条件地执行下一条语句。


Eri*_*hil 6

正式的 C 和 C++ 语法没有指定 anelse是如何关联的。该选择由语法之外的规则指定。C 2018 6.8.4.1 3 说:

\n
\n

An与语法允许的词法上else最接近的前面相关联。if

\n
\n

C++ 2020(草案 N4849)8.5.1 [stmt.if] 1 说:

\n
\n

\xe2\x80\xa6 在第二种形式的if语句中(包括else),如果第一个子语句也是一个if语句,那么该内部if语句应包含一个else部分。[换句话说, anelse必须先与内部关联if,然后外部if才能拥有else。]

\n
\n

要看到语法没有指定 anelse是如何关联的,我们可以检查 C 2018 6.8.4 中的形式语法:

\n
\n

选择语句:
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0if ( 表达式 ) 语句
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0if ( 表达式 ) 语句 else 语句
\n\xc2\ xa0\xc2\xa0\xc2\xa0\xc2\xa0switch ( 表达式 ) 语句

\n
\n

利用该语法,if(y<0) if(y>0) x=3; else x=5;可以将其解析为if(y>0) x=3; else x=5;一条语句,即 \xe2\x80\x9cif ( 表达式 ) 语句 else 语句\xe2\x80\x9d,也可以将其解析为if(y>0) x=3;一条语句,即if ( 表达式 ) 语句。在前一种情况下,父母的表格if(y>0)if不带else. 在后一种情况下,家长if(y>0)将拥有该if \xe2\x80\xa6 else表格。

\n