Java语句,处理优先级("悬空其他")

时间:2015-08-18 15:36:47

标签: java if-statement

给出以下有效代码:

Boolean a = false;

if (a)
   System.out.println("A");
else
   System.out.println("!A");

现在,根据文档if,包括它的条件和内部statement也是statementhttps://docs.oracle.com/javase/tutorial/java/nutsandbolts/if.html - 至少它是&#39}整个文档都叫if-statement

例如:

   if (b){
      System.out.println("B");
   }

statement

但是,当我们要用另一个语句替换现有语句时,它不应该触及整体逻辑,对吧?假设我们将(表达式) - statement替换为上面的if-statement

Boolean a = false;
Boolean b = false:

if (a)
   if (b){
      System.out.println("A and B");
   }
else
   System.out.println("!A");

Java编译器将如下解释代码示例(完整的大括号用于解释):

Boolean a = false;
Boolean b = false:

if (a){
   if (b){
      System.out.println("A nad B");
   } else {
      System.out.println("!A");
   }
}

这不是最初的逻辑。

那么为什么要将一个语句与另一个语句进行交换来改变逻辑?

从示例中可以清楚地看出,问题只是关于大括号,但是我无法找到有关java正在处理此问题的方式的信息,如果有大括号的话。

因此,如果有关于此行为的任何记录,我只是感兴趣吗?为什么java更喜欢将else连接到更新的if,而不是解析时遇到的第一个if

6 个答案:

答案 0 :(得分:8)

当然,答案在Java Language Specification。相关部分是section 14.5, "Statements",它描述了这种情况:

  

与在C和C ++中一样,Java编程语言的if语句遭受所谓的“悬空else问题”,这种错误的格式化示例说明了这一点:

if (door.isOpen())
    if (resident.isVisible())
        resident.greet("Hello!");
else door.bell.ring();  // A "dangling else"
     

问题是外部if语句和内部if语句都可能拥有else子句。在这个例子中,有人可能会猜测程序员希望else子句属于外部if语句。

最后:

  

Java编程语言,如C和C ++以及之前的许多编程语言,任意命令 else子句属于最内层的if它可能属于

(由我强调)

答案 1 :(得分:1)

通过将其与最新的if相关联,您知道您只需要阅读最新的if来理解逻辑。否则,您会阅读所有if和所有else条款,以了解其中任何条款。

假设您最近没有做过,但是最近的if

if (a) 
  if (b) 
     something();
  else // if this is else to if (a)
     something();
else if (c) // what is this the else to?
  something();
else
  something();

当你有多个else子句时,如果else是针对最近的if

,则更容易阅读

答案 2 :(得分:0)

它按预期工作,你缩进并不意味着什么。 else指的是最近的if(b) 您应该填写代码:

Boolean a = false;
Boolean b = false:

if (a)
   if (b){
      System.out.println("A and B");
   } else
      System.out.println("!A");

但总的来说,使用大括号{}

总是好的做法

答案 3 :(得分:0)

这是正确的行为。如果在if语句之后没有花括号,那么只有第一个语句被视为真实条件的一部分。你的例子的问题是没有大括号来定义语句的范围,并且在条件评估b之后有一个大括号。

在第一个if语句之后,第二个if语句使用花括号并建立语句的优先级。你应该使用这样的代码: -

Boolean a = false;
Boolean b = false:

    if (a){
       if (b)
          System.out.println("A and B");
    }
    else
       System.out.println("!A");

答案 4 :(得分:0)

java程序的DOM,称为 AST ,抽象语法树,是一种更纯粹的结构,并且通常用作基础来讨论代码的含义,语义。

线性文本有很多解析缺点,例如:

-(-y) equal to y for most int values
--y

悬空else是一分。

在计算机科学中,只有声明性语言(函数,逻辑)有时会在符号级别上处理。另一方面,C / C ++是出了名的语境。

答案 5 :(得分:-3)

Java是一种面向对象的语言,本质上意味着它在编译代码时遵循自下而上的方法。 这就是为什么它将最新的if语句视为else部分的伴随。