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

我知道这else与第一个匹配,if但我的问题是为什么?我这样想,首先if并且else在相同的范围内(例如主要本地范围),第二个if在第一个如果本地范围else没有可见性?它是否正确?

4

4 回答 4

9

的基本语法if....else是:

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

如果你只是有你的例子减去他们会这样嵌套的括号:

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

基本上意味着else与最新的 available 绑定if,并且满足外部的语法if,因为内部if...else是一个语句

添加大括号给出(首先再次显示整体语法):

if(expr)       stmt       [else stmt]

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

在这里,inner if(expr)..stmt 包含在复合语句(它是语句的子变体)中,最近仍然打开的(读取:在范围内)if是第一个。您还可以将复合语句的结尾(右大括号)视为关闭所有包含的句法结构。

没有compound if,只有一个if控制复合语句。

于 2013-06-28T21:17:47.427 回答
5

语法如下:

'if' '(' <condition> ')' <statement-1> [ 'else' <statement-2> ]

后面有一个语句if,并且在 optional 后面有一个语句else。每个语句都可以是一个块语句,在这种情况下,您必须将它括在一对花括号中。

由于您确实有花括号,因此嵌套在上面的语法中if是 a <statement-1>;因此,else属于外if

请注意,如果您删除花括号,else将属于内部if.

于 2013-06-28T21:08:46.960 回答
5

else与第一个匹配的原因if是因为你强迫它与{and}

他们做什么{}做什么是将任意数量的语句转换成代码“块”,由控制语句(如if)处理,类似于单个语句

如果您的代码没有将第二个 if 语句放入如下块中

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

那么else实际上将对应于第二个 if

于 2013-06-28T21:15:11.240 回答
3

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

为什么要这样设计

所以可能会有这样的陈述:

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

无需另外写括号,如下所示:

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

另请注意,制表符无关紧要 - 它不会影响else执行哪个语句。

于 2013-06-28T21:15:28.280 回答