空块和带 ; 的块仅在 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?