【问题标题】:Empty block and blocks with ; only in if statement空块和带有 ; 的块仅在 if 语句中
【发布时间】:2015-04-15 13:44:18
【问题描述】:

我一直在使用 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 会编译。

【问题讨论】:

  • 您是否尝试过将这些行放入 IDE 中?
  • 为什么你认为答案 c、d 和 e 不正确?
  • 因为 ; 在 Java 中是合法的(如果没有帮助的话)。
  • @TheLostMind 是的,它们会编译。问题是为什么
  • @Nazerke - ; 是一个有效的空语句。 {} 表示有效的空块

标签: java if-statement syntax conditional-statements


【解决方案1】:

这个想法是; 算作一个有效的独立语句,{} 是一个有效的独立代码块。因此,当解析其中任何一个时,它们将是有效代码。他们只是什么都不做。

【讨论】:

  • 好的,我c。的想法;是一个有效的独立声明对我来说是新的。但是为什么 e 是正确的。 e)如果 (真) ;{}; if(boolean) 和 {block} 之间可以有任何语句吗?
  • e) 有点棘手。它实际上不止一个语句:一个 if 语句 (if (true) ;),然后是更多代码 ({};)
【解决方案2】:

选项 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.
} 

他们都做NOTHING。编译器将它们全部删除。

注意: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?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2014-12-14
    相关资源
    最近更新 更多