[java] 왜“short thirty = 3 * 10”이 법적 임무입니까?
경우 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
.
숫자 리터럴에 대해 특별한 일이 있습니까?
답변
컴파일러는 컴파일 타임에10*3
30으로 대체되기 때문 입니다. 따라서 효율적으로 : short thirty = 10 * 3
컴파일 시간에 계산됩니다.
변경 시도 ten
와 three
에 final short
(그들에게 컴파일 시간 상수을) 어떻게되는지 : P를
javap -v
두 버전 ( 10*3
및 final short
)에 대해 사용하여 바이트 코드를 검사 합니다. 차이가 거의 없음을 알 수 있습니다.
자, 여기에 다른 경우에 대한 바이트 코드 차이가 있습니다.
사례 -1 :
자바 코드 : main () {short 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
답변
예, 리터럴 케이스에 특별한 일 10 * 3
이 있습니다 . 컴파일 타임에 평가됩니다 . 따라서 (short)
곱한 리터럴에 대한 명시 적 변환이 필요하지 않습니다 .
ten * three
컴파일시 평가할 수 없으므로 명시 적 변환이 필요합니다.
ten
및 three
표시 가있는 경우 다른 문제가됩니다 final
.