2017-11-30 6 views
0

기본적으로 Java는 사용자가 리터럴을 사용하여 int 값을 정의한다고 가정합니다. 우리가 사용하는 경우리터럴의 암시 적 변환

short x = 20; // There is an implicit conversion 

는 그러나 eample를 들어, 산술 식에 변수를 "X"

short y = x * 2; //DOES NOT COMPILE 

우리는 20 * 2의 결과를 쉽게 짧은 변수에 들어갈 수있는 40, 알고. 무슨 일 이니?

답변

5

처럼 짧은에 캐스팅해야 포인트 :

short y = x * 2; 

컴파일러는 비 최종 변수 x가 그 시간까지 (어떤 수단을 사용해도) 변경되었을 수 있으므로 단순히이를 20으로 처리하지 않을 가능성을 고려합니다. x를 최종으로 정의하면 암시 적 대화가 작동합니다 :

final short x = 20; // There is an implicit conversion 
short y = x * 2; //DOES COMPILE 
0

컴파일러 구현 세부 사항을 모르겠습니다. 이유는 x 값이 컴파일 타임에 알려지지 않았기 때문에 컴파일러가 확인할 수있는 방법이 없다는 것입니다. 그래서 그것은 int라고 가정 할 수 있습니다. 다른 방법으로 컴파일러가 어떻게 동작 할 것으로 기대합니까? 당신은 * 연산자 프로토 타입을 보면

이 정보 참조 : https://www.cs.cmu.edu/~pattis/15-1XX/15-200/lectures/voe/lecture.html

때문에 기술적으로 하나가되지 않습니다 만 (INT, INT) 하나가 (짧은, 짧은).

그러면 x = 20이라는 짧은 코드가 왜 작동하는지 질문 할 수 있습니다. 당신이 다음 short x =20을 쓸 때 Java - short and casting

0

: 이유는이 경우에 최종있는 "20", 상수의 경우 X * 2 최종 볼 동안 자바는 짧은에 자동 주조를 허용 할 수있다 자바는 성공적으로 컴파일하지만 다음 short y=x *2을 쓸 때 그것은 int로서 취급되며 x 최종 아니기 때문에 변수가 여전히 20 명시 programm에에 도달하게 나타날 것이라고는 보장은 없습니다 short y =(short)x*2

0

당신은 (당신이 finalx을하지 않으려는 경우) y에 산술 연산의 결과를 할당 캐스팅 사용하여 다음과 같은 표기법을 사용할 수 있습니다

short y = (short)(x * 2); 

그 대답은 자바 언어 사양에 있다고 생각합니다. 4.2.2 절을 보자. int 형 또는 long 형의 값을 갖는 수치 연산자 목록이있다. java가 int로 처리하고 캐스팅이 필요하다. https://docs.oracle.com/javase/specs/jls/se9/html/jls-4.html#jls-4.2.2