与else语句不一致



这是我上一个问题的修订版。

当使用else-if作为快捷方式时,我不确定为什么在语法方面,它执行与嵌套if-else语句相同的功能。假设您有以下内容:

int score = 80;
if(score < 80) {
System.out.println("C Grade");
} else if(score < 90) {
System.out.println("B Grade");
} else if(score < 100) {
System.out.println("A Grade");
}

如果我添加一些缩进,我会得到类似于以下内容的内容:

if(score < 80) {
System.out.println("C Grade");
} else 
if(score < 90) {
System.out.println("B Grade");
} else 
if(score < 100) {
System.out.println("A Grade");
}

这与编写嵌套的if-else语句的评估结果相同:

if(score < 80) {
System.out.println("C Grade");
} else { 
if(score < 90) {
System.out.println("B Grade");
} else { 
if(score < 100) {
System.out.println("A Grade");
}
}
}

然而,我看到了一个主要的区别。在第三个代码片段中,"else"语句有括号,其余的if-else语句嵌套在这些括号中。而在第一个场景中,没有封装支架。那么,如果我在嵌套if-else语句时似乎需要括号,为什么else-if的第一个想法有效呢?我认为缺少控制流语句(如if、else、while等)的括号会导致编译器只评估以下行,如:

if(condition)
System.out.println("A");
System.out.println("B");
//only prints "A"

如果没有括号,则使用以下语句,而不仅仅是以下

if语句由组成

if (<condition>) <statement> else <statement>

写在几行上也没关系。一般来说,在Java中,换行符可以出现在任何允许空白的地方,而不改变含义(唯一的例外是字符串文字和单行注释)。

首先,请注意ifelse始终应用于它们后面的单个语句。可以使用{ }将多个语句分组为一个复合语句,但条件语句随后适用于单个{ ... }语句。

考虑这两个等价的陈述:

if (foo) {
bar();
}
if (foo)
bar();

在第一个中,if应用于{ }块(包含bar();),而在第二个中,它直接应用于bar();语句。可能不太明显的是,{ }并不是创建复合语句的唯一方法。事实上,if是另一个复合表达式,因此它可以是另一条ifelse语句的直接子表达式。例如:

if (foo)
if (bar) {
baz();
}

完全有效(如果难以阅读),相当于:

if (foo) {
if (bar) {
baz();
}
}

else也有同样的概念——无论后面的语句是什么,如果前面的条件为false,它都将被应用,即使该语句本身是一个复合语句!

if (foo) {
bar();
}
else
if (baz) {
biff();
}

else适用于整个if (baz)块,并且由于它只是一个单一(复合)语句,因此不需要额外的{ }块。

JLS§19规定了确切的语法,JLS§14.9详细说明了if语句的不同形式的语法。注意,这里没有提到else if,因为它不是语言的正式部分,只是语法的(有意的)结果。


尽管如此,我们不按照您描述的方式格式化代码的真正原因只是因为它更难阅读。将else if视为单个关键字并相应地缩进代码要简单得多。其他一些语言(例如Python)使用elif这样的单个关键字来简化语法,但这并不是真正必要的。

括号不是流控制机制。它们主要是一种语句分组机制。

一个简单的ifelse语句的语法是:

'if' '(' expression ')' statement 'else' statement

"statement"可以是赋值语句、方法调用、嵌套的if等等。但"statement(语句)"不是两个语句、三个或。。。

这就是{}的作用所在,因为

'{' statement-list '}'

根据Java语法规则,实际上是CCD_ 26。通过使用花括号,您可以将(可能)多个语句分组为一个语句。

如果你把这些知识应用到你的例子中,你认为你看到的"神秘"行为就会变得简单而直接。

请注意,建议始终将{}块与if语句和循环一起使用,因为这会使代码更易于阅读。


我认为缺少带有控制流语句(如if、else、while等)的括号会导致编译器只计算以下行。

你得出了一个错误的结论。在Java语言中,它(几乎)与代码中换行符的位置无关。唯一的限制是,不能在关键字、运算符、标识符和文字等标记中间放置换行符。(换行符结束//注释。)

顺便说一句,试图通过像文本一样阅读编程语言并猜测语法是一种糟糕的方法。你会有各种不正确的想法。更好的方法是阅读一本好的教科书,或该语言的官方教程材料。

最新更新