复合IF语句范围

时间:2013-06-28 21:03:29

标签: c

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

我知道else与第一个if匹配,但我的问题是为什么?我这样想,首先ifelse属于同一范围(例如,主要是本地范围),第二个if位于第一个else没有可见性的本地范围内?这是正确的吗?

4 个答案:

答案 0 :(得分: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是第一个。您还可以查看复合语句的结尾 - 关闭括号 - 关闭所有包含的语法结构。

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

答案 1 :(得分:5)

语法如下:

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

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

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

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

答案 2 :(得分:5)

else与第一个if匹配的原因是因为您强制使用{}

{}做什么是他们接受任意数量的语句并将其转换为代码的“块”,由控制语句(如if)处理,类似于单一陈述

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

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

然后else实际上对应第二 if

答案 3 :(得分:3)

“我知道其他地方与第一个匹配,但我的问题是为什么?”

为什么设计

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

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

无需编写括号,如下所示:

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

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