我有一个代码片段,如下所示。有人可以解释一下为什么 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)
通过适当的缩进,它会变得更加清晰:
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>
是单个语句,也可以是{
块}
语句。如果没有大括号,则只会有条件地执行下一条语句。
正式的 C 和 C++ 语法没有指定 anelse
是如何关联的。该选择由语法之外的规则指定。C 2018 6.8.4.1 3 说:
\n\nAn与语法允许的词法上
\nelse
最接近的前面相关联。if
C++ 2020(草案 N4849)8.5.1 [stmt.if] 1 说:
\n\n\n\xe2\x80\xa6 在第二种形式的
\nif
语句中(包括else
),如果第一个子语句也是一个if
语句,那么该内部if
语句应包含一个else
部分。[换句话说, anelse
必须先与内部关联if
,然后外部if
才能拥有else
。]
要看到语法没有指定 anelse
是如何关联的,我们可以检查 C 2018 6.8.4 中的形式语法:
\n\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
(
表达式)
语句
利用该语法,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
表格。