"short 30 = 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:
Java 코드: 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
.
다음 답변은 JLS 섹션과 이 동작에 대한 몇 가지 세부사항을 추가합니다.
JLS © 15.2에 준거 - Forms of Expressions (영어)
일부 식에는 컴파일 시 확인할 수 있는 값이 있습니다.이것들은 상수식입니다( 「15.28」).
언급URL : https://stackoverflow.com/questions/32203462/why-is-short-thirty-3-10-a-legal-assignment
'itsource' 카테고리의 다른 글
MySQL에 양수/음수 기호 저장 (0) | 2022.09.26 |
---|---|
Eclipse에서 프로젝트를 JAR로 자동 빌드 (0) | 2022.09.26 |
INSERT IN을 개선하는 방법...잠금 동작 선택 (0) | 2022.09.26 |
문자열의 모든 문자를 반복하는 가장 빠른 방법 (0) | 2022.09.26 |
다차원 배열의 모든 하위 배열 요소를 다시 인덱싱하려면 어떻게 해야 합니까? (0) | 2022.09.26 |