为什么编译器为条件语句重置代码的方式不同?

时间:2017-01-22 16:24:56

标签: java

Java编译器足够聪明,可以在生成类文件时重置源代码。以下是了解这一点的示例。我创建了一个java文件Compiler.java编译器生成此文件的类文件为Compiler.class。

Compiler .java

public class Compiler {
public static void main(String[] args) {
    boolean a = false;
    boolean b = true;
    {// block1
        if (a) {
            System.out.println("I am in if");
        } else if (b) {
            System.out.println("I am in else if");
        } else {
            System.out.println("I am in else");
        }
    }
    {// block2
        if (a) {
        } else if (b) {
        } else {
        }
    }
}

}

Compiler .class   

public class Compiler {
    public static void main(String[] args) {
        boolean a = false;
        boolean b = true;
        if (a) {
            System.out.println("I am in if");
        } else if (b) {
            System.out.println("I am in else if");
        } else {
            System.out.println("I am in else");
        }
        if (!a) {
        }
    }
}

如果可以在生成的类文件中观察到block1和block2之间的差异。可以理解java编译器如何以智能方式工作。编译器检查block1中的第一个“if else if”条件语句,并发现在这些语句中有一些要执行的内容(即print语句),因此它生成block1,就像在java源代码中一样。在第二个块中,我的意思是在block2编译器中发现if -esle if语句中没有任何内容要执行,所以它转换并重置block2,因为你可以看到上面的类文件。编译器只是将“if else if block”转换为if语句,该语句将根据布尔值执行或不执行。

在第二个块if语句中也包含否定。有人可以解释一下吗?谢谢你的提前。

1 个答案:

答案 0 :(得分:0)

看起来编译器在块2的第一级“else”中看到了一些代码,并且在匹配中没有任何内容,因此将条件还原为将不必要的“if-else”减少为简单的“if”。

然后在第二级if-else上深入移动,发现无论变量状态如何,代码都不会执行任何操作,从而删除整个第二级if-else。

此时,现在单独的第一级'if'应该包含第二级块代码,但该块刚刚完全删除,编译器没有“回来”再次检查它,因此离开第一个'if'为空。