编译器会优化它吗
2022-09-03 17:07:00
假设我在C代码中有这样的东西。我知道你可以用一个来代替,让编译器不编译它,但只是出于好奇,我问编译器是否也会弄清楚这件事。#define
我认为这对于Java编译器来说更为重要,因为它不支持.#define
const int CONDITION = 0;
........
// Will the compiler compile this?
if ( CONDITION )
{
}
.......
假设我在C代码中有这样的东西。我知道你可以用一个来代替,让编译器不编译它,但只是出于好奇,我问编译器是否也会弄清楚这件事。#define
我认为这对于Java编译器来说更为重要,因为它不支持.#define
const int CONDITION = 0;
........
// Will the compiler compile this?
if ( CONDITION )
{
}
.......
在Java中,if中的代码甚至不会成为编译代码的一部分。它必须编译,但不会写入已编译的字节码。它实际上取决于编译器,但我不知道有哪个编译器不优化它。规则在 JLS 中定义:
优化编译器可能会意识到语句 x=3;将永远不会被执行,并且可能会选择从生成的类文件中省略该语句的代码,但语句 x=3;不被视为此处指定的技术意义上的“无法访问”。
这种不同处理的基本原理是允许程序员定义“标志变量”,例如:
static final boolean DEBUG = false;
然后编写代码,例如:
if (DEBUG) { x=3; }
这个想法是,应该可以将DEBUG的值从false更改为true或从true更改为false,然后正确编译代码,而无需对程序文本进行其他更改。
不了解 C。
首先,Java不允许在C(等)等条件中使用非布尔值。此外,如果您在检查中有一个“常量”表达式,编译器会警告您正在比较相同的表达式,因此我确信它已经优化。例如:if
while
if
final int i = 1;
if (1 == i) { // warning
System.out.println("HI");
}