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