空块和带 ; 的块仅在 if 语句中
Empty block and blocks with ; only in if statement
我一直在通过 Java SE 7 Programmer 1 学习指南中的测试来测试自己。关于 if 语句有这个问题。它询问哪个选项不会编译:
> a) if(true) ;
> b) if(true) {}
> c)if(true) {;}
> d)if(true) {;;}
> e)if (true) ;{};
> f) all of them will compile
答案是f。而且我无法理解或解释为什么答案 c、d 和 e 会编译。
想法是 ;
算作一个有效的独立语句,{}
是一个有效的独立代码块。因此,当解析其中任何一个时,它们将是有效代码。他们什么都不做。
选项C、D、E有效。它们都被编译器忽略。
public static void main(String[] args) {
if(true) {;} // a valid empty statement inside a code block --> valid
if(true){;;} // 2 valid empty statements inside a code block --> valid
if(true);{}; // a valid empty statement followed by an empty codeblock followed by another valid empty / dummy statement.
}
他们都什么都不做。编译器将它们全部删除。
注意:if(true)
会被编译器忽略,但 while(true)
不会,并且会在字节码中作为 goto
语句出现。
字节码:
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=0, locals=1, args_size=1
0: return --> Where on earth are my if conditions?
我一直在通过 Java SE 7 Programmer 1 学习指南中的测试来测试自己。关于 if 语句有这个问题。它询问哪个选项不会编译:
> a) if(true) ;
> b) if(true) {}
> c)if(true) {;}
> d)if(true) {;;}
> e)if (true) ;{};
> f) all of them will compile
答案是f。而且我无法理解或解释为什么答案 c、d 和 e 会编译。
想法是 ;
算作一个有效的独立语句,{}
是一个有效的独立代码块。因此,当解析其中任何一个时,它们将是有效代码。他们什么都不做。
选项C、D、E有效。它们都被编译器忽略。
public static void main(String[] args) {
if(true) {;} // a valid empty statement inside a code block --> valid
if(true){;;} // 2 valid empty statements inside a code block --> valid
if(true);{}; // a valid empty statement followed by an empty codeblock followed by another valid empty / dummy statement.
}
他们都什么都不做。编译器将它们全部删除。
注意:if(true)
会被编译器忽略,但 while(true)
不会,并且会在字节码中作为 goto
语句出现。
字节码:
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=0, locals=1, args_size=1
0: return --> Where on earth are my if conditions?