否则如果比较 - 编译器立场

时间:2015-01-28 20:02:50

标签: if-statement compilation java-bytecode-asm

这些代码块是否相同?我的意思是相同的,编译器是否完全以相同的方式解释它们?

int i = 2;
if (i == 0) {
    System.out.println("0!");
} else if (i == 1) {
    System.out.println("1!");
} else if (i == 2) {
    System.out.println("2!");
} else {
    System.out.println("?!");
}

int i = 2;
if (i == 0) {
    System.out.println("0!");
} else {
    if (i == 1) {
        System.out.println("1!");
    } else {
        if (i == 2) {
            System.out.println("2!");
        } else {
            System.out.println("?!");
        }
    }
}

正如您所看到的,这是Java。

虽然我的朋友和我都同意逻辑上这些完全相同,但我想知道java编译器是否以完全相同的方式编译它们。让我印象深刻的是,在第二个/ if块中,你在else块中嵌入了ifs和elses。

但是,由于我对汇编或java字节代码缺乏了解,因此编译完全相同。唯一的优势可能是语法糖,如果你愿意的话。

有人会让这个问题得到解决 - 假设你对答案非常有信心(否则可能会引发另一场辩论)。

1 个答案:

答案 0 :(得分:1)

这两个代码示例的区别仅在于冗余花括号的使用,所以如果生成不同的代码,我会非常惊讶。但是很容易检查你是否真的很好奇 - 使用javap命令来显示字节码。