itsource

"short 30 = 3 * 10"이 법적 할당인 이유는 무엇입니까?

mycopycode 2022. 9. 26. 22:04
반응형

"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

반응형