我在 Eclipse 中尝试了以下操作:
if (false) {}
:警告“死代码”while (false) {}
:编译错误“无法访问的代码”
我想知道这种差异是否有真正的“原因”。我已经找到了这个...
...但为什么不允许while (false)
相同的调试目的?
我在 Eclipse 中尝试了以下操作:
if (false) {}
:警告“死代码”while (false) {}
:编译错误“无法访问的代码”我想知道这种差异是否有真正的“原因”。我已经找到了这个...
...但为什么不允许while (false)
相同的调试目的?
JLS 关于无法访问代码的部分解释了基本原理。本质上,Java 通常不应该像 C 一样使用条件编译#ifdef
,但在某些情况下(例如调试,特别是向后二进制兼容性)需要允许编译器完全去除代码,因此特定的构造if(false)
被允许用于该目的。
您必须阅读Unreachable Statements。虽然while(false)
编译器会抛出错误,但会if(false)
向用户显示警告。
虽然if (false)
被保存在 Java 中以模拟 C/C++ 预处理器#if 0
规范说:
如果 (假) { x=3; }
不会导致编译时错误。优化编译器可能会意识到语句 x=3; 将永远不会被执行,并且可以选择从生成的类文件中省略该语句的代码,但是语句 x=3; 在此处指定的技术意义上,不被视为“无法访问”。
这种不同处理的基本原理是允许程序员定义“标志变量”,例如:
静态最终布尔调试 = 假;然后编写代码,例如:
如果(调试){ x=3; 这个想法是应该可以将 DEBUG 的值从 false 更改为 true 或从 true 更改为 false,然后正确编译代码,而无需对程序文本进行其他更改。
但是,“do-while 循环”将编译并执行。
do {
System.out.println("its work!");
} while (false); //compile and execute