这是我之前问题的修订版。
当使用else-if作为快捷方式时,我不完全确定为什么,语法方面,它执行与嵌套if-else语句相同的功能。 假设您有以下内容:
1 2 3 4 5 6 7 8
| 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");
} |
如果我添加一些缩进,我得到类似的东西:
1 2 3 4 5 6 7 8 9
| 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语句的结果相同:
1 2 3 4 5 6 7 8 9 10 11
| 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语句嵌套在这些括号中。 在第一种情况下,没有封装括号。 那么,为什么第一个想法是else-if work,如果我在嵌套if-else语句时看似需要括号? 我认为缺少括号与控制流语句,如if,else,while等导致编译器只评估以下行,例如:
1 2 3 4
| if(condition )
System. out. println("A");
System. out. println("B");
//only prints"A" |
-
else-if在Java中表现为else,后跟if - intensionally。 缺少括号不会评估以下行,但以下语句。 因为if(或if else)是一个声明,所以它非常一致。
-
提问时的一个提示 - 在你的标题中做出断言(例如假定else语句不一致)将导致downvotes,因为人们可能不同意你的断言而不是试图帮助你。 而是专注于你真正要求的东西,例如"你能帮我理解else if语句的语法吗?" 这将鼓励援助,而不是投票。
如果没有括号,则使用以下语句,而不仅仅是以下行。
if语句包含
1
| if (<condition>) <statement> else <statement> |
它是否写在几行上并不重要。通常,在允许使用空格而不改变含义的任何地方,Java都可以发生换行符(唯一的例外是字符串文字和一行注释)。
-
啊!所以if和else都是一个声明?因此,当"else"没有括号时,它将查看if和else的第一个"对",并评估它?
-
是。 else始终与最近的if匹配。
-
只是为了澄清,if-else分组是一个陈述?但在此范围内,还有与"if"和"else"相对应的陈述?
-
@ rb612不确定我明白你的意思。嵌套语句可以是任意复杂的(包含循环,ifs,......)。
支架不是流量控制机制。它们主要是一种语句分组机制。
简单if else语句的语法是:
1
| 'if' '(' expression ')' statement 'else' statement |
'statement'可以是赋值语句,方法调用,嵌套if等。但'声明'不是两个陈述,或三个,或......
这是{ }进入它的地方,因为
根据Java语法规则实际上是statement。通过使用大括号,您可以将(可能)许多语句分组到单个语句中。
如果您将这些知识应用于您的示例,您认为您所看到的"神秘"行为将变得简单直接。
对于记录,建议您始终使用带有if语句和循环的{ }块,因为它使您的代码更易于阅读。
I thought that a lack of brackets with control flow statements such as if, else, while, etc. cause the compiler to only evaluate the following line.
你得出了一个错误的结论。在Java语言中,它(几乎)与您放置换行符的代码的含义无关。唯一的限制是你不能在代码中间放置换行符,如关键字,运算符,标识符和文字。 (并且换行结束//评论。)
顺便说一句,尝试通过阅读文本和猜测语法来学习编程语言是一种糟糕的方法。你会有各种不正确的想法。更好的方法是阅读一本好的教科书或该语言的官方教程材料。
-
谢谢Stephen,我同意。我已经学习了Java多年了,这个想法刚刚出现,因为我已经习惯了使用else,但刚开始质疑它为什么会起作用。因此,我的第二个代码片段中的所有内容,从if(score < 90)到最后一个语句?
-
因此,为了确保我完全理解,如果没有大括号的Java的"else"块仅评估下一个语句,如果它后跟if-else,则"if"和"else"被认为是一个语句?否则,Java不会将"else"评估为嵌套的一部分,对吗?
-
它比这简单。在else之后应该有一个声明。它可以是一个简单的方法调用或赋值语句。它可能是另一个if语句。它可能是一个块声明。它只需要一个声明。
-
感谢您的答复。但是如果你没有大括号,因此Java只会评估下一个语句,它不会简单地评估if部分,而不是"else"部分,因为那些是单独的语句?或者是if和else一起声明?这就是我困惑的地方。
-
不。别的不是声明。 else之后的语句是if ... else ... 语句的一部分。语句可以包含其他语句
-
好的,澄清一下,"if ... else ......"是一个包含陈述的陈述吗?
-
那是正确的
首先,请注意if和else始终适用于它后面的单个语句。您可以使用{ }将多个语句分组到单个复合语句中,但条件则适用于单个{ ... }语句。
考虑这两个等价的陈述:
1 2 3 4 5 6
| if (foo) {
bar();
}
if (foo)
bar(); |
在第一个中,if适用于{ }块(包含bar();),而在第二个中,它直接应用于bar();语句。可能不会立即显而易见的是{ }不是创建复合语句的唯一方法。实际上,if是另一个复合表达式,因此它可以是另一个if或else语句的直接子节点。例如:
1 2 3 4
| if (foo)
if (bar) {
baz();
} |
完全有效(如果难以阅读)并且相当于:
1 2 3 4 5
| if (foo) {
if (bar) {
baz();
}
} |
同样的概念对于else也是如此 - 如果前面的条件为假,即使该语句本身就是一个复合语句,它将被应用。
1 2 3 4 5 6 7
| if (foo) {
bar();
}
else
if (baz) {
biff();
} |
else适用于整个if (baz)块,因为它只是一个(复合)语句,所以不需要额外的{ }块。
确切的语法在JLS§19中指定,if语句的不同形式的语法在JLS§14.9中详述。请注意,没有提到else if,因为它不是语言的正式部分,只是语法的(故意)后果。
所有这些都说,我们不按照你描述的方式格式化代码的真正原因仅仅是因为它更难阅读。将else if视为单个关键字并相应缩进代码要简单得多。其他一些语言(例如Python)使用单个关键字(如elif)来简化语法,但这并不是必需的。
-
谢谢!!这非常有帮助。我试图完全理解 - 我在我的问题中写的第二句话是第4行到底是什么声明呢?从if(score < 90)到最后
-
嗯,是和否:) if-else语句的if和else主体本身就是语句,因此也可以是if-else语句。换句话说,您的每个示例都是单个语句 - 但这些语句由子表达式组成,这些子表达式也是有效语句。
-
我在答案中添加了一些指向JLS的链接,以防有用。
-
再次感谢!所以只是为了澄清一下,因为"else"会查看下一个语句,它会将下一个if和else语句一起看作一个语句吗?因为如果它们不是一个声明,那么"else"只会评估嵌套的"if"而不是"else"
-
我不知道根据关键字的"外观"来考虑它是多么有用。而是尝试用定义Java语法的语法来思考。 if关键字必须后跟布尔表达式,然后是语句。然后可以选择跟随else和另一个语句。由于这本身就是一个有效的语句,因此可以将条件语句嵌套在另一个中。相反,else不可能(根据语法)出现在if的body语句之后的任何地方。
-
我只是想知道缺少括号导致java只评估以下语句的想法。那么"以下陈述"是由if和else组成的吗?这是我能够正确执行代码的唯一方法
-
因为如果if和else是跟在"else"之后的单独语句,那么你需要括号来执行它们。
-
这是正确的 - if () 和if () else 都是有效的语法,而else (单独)是无效的。