[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컴파일 시간에 계산됩니다.

변경 시도 tenthreefinal short(그들에게 컴파일 시간 상수을) 어떻게되는지 : P를

javap -v 두 버전 ( 10*3final 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 

위의 경우, 103로컬 변수에서 촬영 s1s2


답변

예, 리터럴 케이스에 특별한 일 10 * 3이 있습니다 . 컴파일 타임에 평가됩니다 . 따라서 (short)곱한 리터럴에 대한 명시 적 변환이 필요하지 않습니다 .

ten * three 컴파일시 평가할 수 없으므로 명시 적 변환이 필요합니다.

tenthree표시 가있는 경우 다른 문제가됩니다 final.


답변

다음 답변 은 JLS 섹션과이 동작에 대한 세부 정보를 추가합니다.

당으로 §15.2 JLS – 표현의 양식

일부 식에는 컴파일 타임에 확인할 수있는 값이 있습니다. 이들은 상수 표현식입니다 (§15.28).


답변