复合IF语句范围

3
if()//first if
{
  if()//second if
   statement;
}
else
 statement;

我知道else与第一个if匹配,但我的问题是为什么?我认为它应该像这样,第一个ifelse在同一范围内(例如主要的本地范围),而第二个if在第一个if的本地范围内,在这个范围内,else是不可见的。这正确吗?

2
你的解释听起来差不多就是你想问的吗? - Carl Norum
“else”匹配最后一个“if”语句,不包括在括号中的(更局部范围内的)。所以是的,那是正确的。 - tay10r
@TaylorFlores 我知道作为一名大学生我写了很多代码,但是当我向教授提出这样的问题时,他们会回答:“如果在if块中有一个if语句,则在块外部的else语句中它是不可见的。”我希望在这里能得到更好的解释。 - user1478167
我不明白这个问题。 - Sam I am says Reinstate Monica
1
如果你真的想了解类似这样的内容是如何被解析的,你必须理解无上下文文法。 - aaronman
显示剩余3条评论
4个回答

9
if....else 的基本语法如下:

              --optional-
if(expr) stmt [else stmt]

如果您只是去掉花括号,那么它们将以这种方式嵌套:

         ---------stmt----------
if(expr) if(expr) stmt else stmt

基本上意味着else与最近可用的if绑定,并且外部if的语法得到满足,因为内部的if...else是一条语句。
添加大括号后的结果(整个语法如下):
if(expr)       stmt       [else stmt]

         --compound-stmt--
if(expr) { if(expr) stmt } else stmt

在这里,内部的if(expr)..stmt被包含在一个复合语句中(它是语句的子类型),最近仍然打开(即:在作用域内)的if是第一个。你也可以将复合语句的末尾 - 闭合括号 - 视为关闭所有包含的语法结构。

没有复合if,只有控制复合语句的if


5
语法如下:
'if' '(' <condition> ')' <statement-1> [ 'else' <statement-2> ]

if后面有一个语句,而在可选的else后面有一个语句。每个语句都可以是一个块语句,在这种情况下,必须用一对大括号将其括起来。

由于您使用了花括号,嵌套的if是上述语法中的<statement-1>;因此else属于外部的if

请注意,如果您删除大括号,则else将属于内部的if


5
由于您使用了 {},因此 else 与第一个 if 匹配。

{} 的作用是将任意数量的语句转换为“代码块”,控制语句(如 if)会将其视为单个语句进行处理。

如果您的代码没有像以下示例那样将第二个 if 语句放入一个代码块中:

if()//first if
  if()//second if
   statement;
else
 statement;

如果使用else语句,它实际上对应的是第二个if语句。


3

我知道else与第一个if匹配,但我的问题是为什么?

为什么要这样设计?

这样可以有像这样的语句:

if (istrue)
    if (thatstrue) dosomething ();
    else donothing2 ();
else donothing1 ();

不需要像这样写括号:

if (istrue){
    if (thatstrue) dosomething ();
    else donothing2 ();
} else donothing1 ();

请注意,制表符并不重要-它不会影响执行哪个else语句。

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