给出以下有效代码:
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 - 至少它是&#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
?
答案 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部分的伴随。