如果short
在算术运算中自动提升为int
,那么原因是:
short thirty = 10 * 3;
short
变量thirty
的合法分配?
反过来,这个:
short ten = 10;
short three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
以及:
int ten = 10;
int three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
无法编译,因为如果没有按预期方式进行转换,则不允许将int
值分配给short
。
关于数值文字有什么特别之处吗?
答案 0 :(得分:137)
因为编译器在编译时本身用30替换10*3
。因此,有效地:short thirty = 10 * 3
在编译时计算。
尝试将ten
和three
更改为final short
(使其成为编译时间常量),看看会发生什么:P
使用javap -v
检查字节代码(10*3
和final short
)。你将能够看到差别很小。
好的,所以,这是不同情况下的字节代码差异。
案例-1:
Java代码: main(){ 短s = 10 * 3; }
字节代码:
stack=1, locals=2, args_size=1
0: bipush 30 // directly push 30 into "s"
2: istore_1
3: return
案例-2:
public static void main(String arf[]) {
final short s1= 10;
final short s2 = 3;
short s = s1*s2;
}
字节代码:
stack=1, locals=4, args_size=1
0: bipush 10
2: istore_1
3: iconst_3
4: istore_2
5: bipush 30 // AGAIN, push 30 directly into "s"
7: istore_3
8: return
案例-3:
public static void main(String arf[]) throws Exception {
short s1= 10;
short s2 = 3;
int s = s1*s2;
}
字节码:
stack=2, locals=4, args_size=1
0: bipush 10 // push constant 10
2: istore_1
3: iconst_3 // use constant 3
4: istore_2
5: iload_1
6: iload_2
7: imul
8: istore_3
9: return
在上述情况中,10
和3
取自局部变量s1
和s2
答案 1 :(得分:18)
是的,文字案例会有一些特殊情况:{em}将在编译时评估10 * 3
。因此,您不需要对乘法文字进行明确的(short)
转换。
ten * three
不是编译时可评估的,因此需要显式转换。
如果ten
和three
被标记为final
,那将是另一回事。
答案 2 :(得分:0)
以下answer添加了JLS部分以及有关此行为的一些详细信息。
根据JLS §15.2 - Forms of Expressions
某些表达式具有可在编译时确定的值。 这些是常量表达式(§15.28)。