【问题标题】:if(false) vs. while(false): unreachable code vs. dead codeif(false) vs. while(false):不可达代码 vs. 死代码
【发布时间】:2015-08-23 02:23:33
【问题描述】:

我在 Eclipse 中尝试了以下操作:

  • if (false) {}:警告“死代码”
  • while (false) {}: 编译错误'无法访问的代码'

我想知道这种差异是否存在真正的“原因”。这个我已经找到了...

Unreachable code compiler error

...但是为什么不允许 while (false) 用于相同的调试目的?

【问题讨论】:

    标签: java dead-code unreachable-code


    【解决方案1】:

    JLS section on unreachable code 解释了基本原理。本质上,Java 通常不应该像 C 那样使用条件编译,通常使用 #ifdef,但是在某些情况下(例如调试,特别是向后二进制兼容性)需要允许编译器完全去除代码,因此为此目的,允许使用特定构造 if(false)

    【讨论】:

    • +1 but why not allow while (false) for the same debugging purpose? 我没收到那部分?
    • 这是否意味着if(false) {} 是编译器“允许”无法访问代码的唯一例外?
    • @NarendraPathai while(false) 对调试没有意义;在调试(或二进制兼容性)情况下,您将关闭部分或在版本之间交替(例如 Android 兼容性库)。在这两种情况下,任何循环都将保留在原处,并且最好将可达性规则的例外情况保持在尽可能窄的范围内。
    • @luukburger 不是字面意义上的if(false),而是if(compile-time-false-expression)
    • @NarendraPathai JLS 中链接段落的末尾解释了原因:条件编译
    【解决方案2】:

    您必须阅读Unreachable Statements。虽然使用while(false) 编译器会抛出错误,但使用if(false) 会向用户显示警告。

    虽然if (false)保留在Java中以模拟C/C++预处理器#if 0

    规范说:

    如果 (假) { x=3; }

    不会导致编译时错误。优化编译器可能 意识到语句 x=3;永远不会被执行并且可以选择 从生成的类文件中省略该语句的代码,但是 语句 x=3;在技​​术上不被视为“无法到达” 此处指定的意义。

    这种不同处理的基本原理是允许程序员 定义“标志变量”,例如:

    静态最终布尔 DEBUG = false;然后写代码如:

    如果(调试){ x=3;这个想法是应该可以改变 DEBUG 的值从 false 到 true 或者从 true 到 false 然后 正确编译代码,无需对程序文本进行其他更改。

    【讨论】:

    • 编译器不会为if (false {} 抛出错误。这就是重点。
    • 我仍然投反对票,因为编译器不会if(false)的情况下引发错误。
    • @RahulTripathi while(false) 是编译时错误。 if(false)可能产生警告,但明确不是编译时错误。
    • @luukburger:- 是的,你是对的。我弄错了。我已经更新了我的答案以及编译器不会抛出错误的理由!
    • 值得注意的是if (compileTimeConstant) {...}作为一个结构是有意义的,while(true) {...}do {...} while(compileTimeConstant)是有意义的,但是while(compileTimeConstant) {...}在任何情况下都没有意义[除了文字- true one] 最好写成if (compileTimeConstant) { while(true) {} }
    【解决方案3】:

    但是,“do-while 循环”将编译并执行。

    do {
        System.out.println("its work!");
    } while (false);                       //compile and execute
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 2011-12-28
      相关资源
      最近更新 更多