今天我在教授一门介绍性编程课程,讲解了Java中涉及变量赋值的简单代码。这段代码的目的不是为了展示任何特别激动人心的东西,而是为了确保学生理解变量赋值语句。
我在黑板上写下了以下方法,并逐行解释:
private void simpleMethod() {
int myInt = 137;
myInt = 42;
myInt = myInt + 1;
/* ... code using myInt ... */
}
一个学生问我,在程序运行时,变量myInt是否会实际持有值137和42,或者它是否会直接跳到持有43的值。我告诉学生,代码将逐行执行,因此变量实际上会持有这些中间值。但老实说,我不确定javac会生成什么字节码(完全忽略JVM所做的优化)。 javac(或任何Java编译器)是否可以合法地将愚蠢的赋值语句优化掉,并直接将myInt初始化为43?
根据我的系统上的javap,使用javac编译的上述代码产生
0: sipush 137
3: istore_1
4: bipush 42
6: istore_1
7: iload_1
8: iconst_1
9: iadd
10: istore_1
11: return
所以这里没有进行任何优化。我的问题是,是否可以对此进行优化,以便解决问题。
javap
иҪ»жқҫжөӢиҜ•дёҖдёӢиөӢеҖјжҳҜеҗҰиў«дјҳеҢ–дәҶгҖӮиҮідәҺиҝҷж ·еҒҡжҳҜеҗҰеҗҲжі•...иҝҷд№ҹжҳҜжҲ‘жғізҹҘйҒ“зҡ„дәӢжғ…гҖӮ - nhahtdhjavap
的输出结果。没有进行任何优化。 - templatetypedef