【发布时间】:2011-01-20 00:43:59
【问题描述】:
这是一个有趣的三元运算符测试:
public int so( final int a ) {
int r = (int) System.currentTimeMillis();
r += a == 2 ? 1 : 0;
return r;
}
这是生成的字节码:
public int doIt(int);
Code:
0: invokestatic #2; //Method java/lang/System.currentTimeMillis:()J
3: l2i
4: istore_2
5: iload_2
6: iload_1
7: iconst_2
8: if_icmpne 15
11: iconst_1
12: goto 16
15: iconst_0
16: iadd
17: istore_2
18: iload_2
19: ireturn
看到它没有删除“+ 0”的“else”大小写,我有点惊讶。我更期待这个:
public int doIt(int);
Code:
0: invokestatic #2; //Method java/lang/System.currentTimeMillis:()J
3: l2i
4: istore_2
5: iload_1
6: iconst_2
7: if_icmpne 13
10: iinc 2, 1
13: iload_2
14: ireturn
所以我的问题来了:规范是否要求:
goto ...
iconst_0
sequence 因为我使用了三元运算符,或者这只是编译器的事情?
显然,这个问题与写作 'r += ... 的相关性无关? 1:0'。但我很惊讶,因为在其他情况下,编译器做了一些优化,而在这里它没有做任何优化。
生成选项 2 的 Java 编译器是否仍然是有效的 Java 编译器(如果我没有搞砸我的示例,但重点是:在生成的代码中有一个不必要的 0 和一个不必要的 goto,编译器可以吗?删除它仍然是有效的 .java 编译器)?
【问题讨论】:
标签: java bytecode ternary-operator