编译器会优化它吗

2022-09-03 17:07:00

假设我在C代码中有这样的东西。我知道你可以用一个来代替,让编译器不编译它,但只是出于好奇,我问编译器是否也会弄清楚这件事。#define

我认为这对于Java编译器来说更为重要,因为它不支持.#define

const int CONDITION = 0;
........
// Will the compiler compile this?
if ( CONDITION )
{

}
.......

答案 1

在Java中,if中的代码甚至不会成为编译代码的一部分。它必须编译,但不会写入已编译的字节码。它实际上取决于编译器,但我不知道有哪个编译器不优化它。规则在 JLS 中定义:

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

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

static final boolean DEBUG = false;

然后编写代码,例如:

if (DEBUG) { x=3; }

这个想法是,应该可以将DEBUG的值从false更改为true或从true更改为false,然后正确编译代码,而无需对程序文本进行其他更改。

不了解 C。


答案 2

首先,Java不允许在C(等)等条件中使用非布尔值。此外,如果您在检查中有一个“常量”表达式,编译器会警告您正在比较相同的表达式,因此我确信它已经优化。例如:ifwhileif

    final int i = 1;
    if (1 == i) { // warning
        System.out.println("HI");
    }

推荐