[java] Java의 + =,-=, * =, / = 복합 할당 연산자에 캐스팅이 필요하지 않은 이유는 무엇입니까?

오늘까지는 예를 들어 다음과 같이 생각했습니다.

i += j;

다음에 대한 바로 가기였습니다.

i = i + j;

그러나 우리가 이것을 시도한다면 :

int i = 5;
long j = 8;

그러면 i = i + j;컴파일되지 않지만 정상적으로 컴파일 i += j;됩니다.

실제로 i += j;이와 같은 바로 가기
라는 것을 의미합니까 i = (type of i) (i + j)?



답변

이러한 질문들과 마찬가지로 JLS는 그 해답을 가지고 있습니다. 이 경우 §15.26.2 복합 할당 연산자 . 추출물 :

형태의 복합 대입 식을 E1 op= E2동등 E1 = (T)((E1) op (E2))여기서 T의 타입 E1즉 제외 E1한번만 평가된다.

§15.26.2 에서 인용 된 예

[…] 다음 코드가 맞습니다 :

short x = 3;
x += 4.6;

x는 다음과 같기 때문에 값 7을 갖습니다.

short x = 3;
x = (short)(x + 4.6);

다시 말해, 당신의 가정은 맞습니다.


답변

이 캐스팅의 좋은 예는 * = 또는 / =

byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57

또는

byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40

또는

char ch = '0';
ch *= 1.1;
System.out.println(ch); // prints '4'

또는

char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'


답변

아주 좋은 질문입니다. Java 언어 사양은 귀하의 제안을 확인합니다.

예를 들어 다음 코드는 정확합니다.

short x = 3;
x += 4.6;

x는 다음과 같기 때문에 값 7을 갖습니다.

short x = 3;
x = (short)(x + 4.6);

답변

예,

기본적으로 우리가 쓸 때

i += l; 

컴파일러는 이것을 이것을

i = (int)(i + l);

방금 .class파일 코드를 확인했습니다 .

정말 좋은 점


답변

당신은에서 캐스트 필요 longint explicitly하는 경우에 i = i + l 다음 컴파일하고 정확한 출력을 제공 할 것입니다. 처럼

i = i + (int)l;

또는

i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.

그러나 +=연산자가 내재적으로 올바른 변수 유형에서 왼쪽 변수 유형으로 유형 캐스팅을 수행하므로 명시 적으로 캐스팅 할 필요가 없으므로 제대로 작동합니다.


답변

여기서 문제는 유형 캐스팅과 관련이 있습니다.

int와 long을 추가하면

  1. int 객체는 long으로 캐스트되고 둘 다 추가되며 긴 객체를 얻습니다.
  2. 그러나 긴 객체는 암시 적으로 int로 캐스팅 할 수 없습니다. 따라서 명시 적으로해야합니다.

그러나 +=유형 캐스팅을 수행하는 방식으로 코딩됩니다.i=(int)(i+m)


답변

할당 유형의 오른쪽에있는 표현식 유형이 할당의 왼쪽에있는 변수 유형으로 안전하게 승격 될 수있는 경우 Java 유형 변환은 자동으로 수행됩니다. 따라서 다음을 안전하게 할당 할 수 있습니다.

 byte-> short-> int-> long-> float-> double. 

다른 방식으로는 동일하게 작동하지 않습니다. 예를 들어 첫 번째는 두 번째보다 많은 저장 공간이 필요하므로 정보가 손실 될 수 있기 때문에 long을 int로 자동 변환 할 수 없습니다. 그러한 개종을 강요하려면 명시적인 개종을 수행해야합니다.
유형-변환