오늘까지는 예를 들어 다음과 같이 생각했습니다.
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
파일 코드를 확인했습니다 .
정말 좋은 점
답변
당신은에서 캐스트 필요 long
로 int
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을 추가하면
- int 객체는 long으로 캐스트되고 둘 다 추가되며 긴 객체를 얻습니다.
- 그러나 긴 객체는 암시 적으로 int로 캐스팅 할 수 없습니다. 따라서 명시 적으로해야합니다.
그러나 +=
유형 캐스팅을 수행하는 방식으로 코딩됩니다.i=(int)(i+m)
답변
할당 유형의 오른쪽에있는 표현식 유형이 할당의 왼쪽에있는 변수 유형으로 안전하게 승격 될 수있는 경우 Java 유형 변환은 자동으로 수행됩니다. 따라서 다음을 안전하게 할당 할 수 있습니다.
byte-> short-> int-> long-> float-> double.
다른 방식으로는 동일하게 작동하지 않습니다. 예를 들어 첫 번째는 두 번째보다 많은 저장 공간이 필요하므로 정보가 손실 될 수 있기 때문에 long을 int로 자동 변환 할 수 없습니다. 그러한 개종을 강요하려면 명시적인 개종을 수행해야합니다.
유형-변환