Java语句,处理优先级(“悬挂其他”)

鉴于以下有效代码:

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

现在,根据文档, if包括它的条件和内部statement也是一个statement ( https://docs.oracle.com/javase/tutorial/java/nutsandbolts/if.html – 至少它被称为if-statement遍及整个文档)

例如:

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

是一份statement

但是,当我们要用另一个语句替换现有语句时,它不应该触及整体逻辑,对吧? 假设我们用上面的if-statement替换(Expression) – 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 ,而不是在解析时遇到的第一个?

当然,答案在Java语言规范中 。 相关部分是第14.5节“声明” ,它描述了这种情况:

与在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子句属于它可能属于的最内层

(我强调)

如果您真正有兴趣了解有关Java的所有知识,那么Java规范是一个有价值的工具。 第2部分对您和您的问题很感兴趣。

通过让它与最新的相关联, 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 ,则更容易阅读

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

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

但总的来说,使用大括号总是好的做法{}

这是正确的行为。 如果在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"); 

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

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

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

悬挂的else是一点。

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

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