Java의 + =, - =, * =, / = 복합 할당 운영자가 주조가 필요합니까?
질문
오늘까지는 예를 들면 다음과 같습니다.
i += j;
다음과 같은 바로 가기였습니다.
i = i + j;
그러나 이것을 시도하면 :
int i = 5;
long j = 8;
그런 다음 i = i + j;컴파일되지 않지만 i + = j;벌금을 컴파일합니다.
사실 i + = j;이런 것에 대한 바로 가기입니다 i = (I 종류) (i + j)?
답변
항상 이러한 질문에 따라 JLS가 답변을 보유하고 있습니다.이 경우 §15.26.2 복합 할당 운영자.추출물 :
e1 op = e2의 화합물 할당 발현은 E1 = (t) ((e1) op (e2))와 동일하다. 여기서 e1은 E1이 한 번만 평가된다는 것을 제외하고는 e1이다.
§15.26.2에서 인용 된 예제
[...] 다음 코드가 정확합니다. 짧은 x = 3; x + = 4.6; 그리고 값 7이 있으므로 x가 값 7을 사용합니다. 짧은 x = 3; x = (짧은) (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 언어 사양은 귀하의 제안을 확인합니다.
예를 들어, 다음 코드가 올바른 것입니다. 짧은 x = 3; x + = 4.6; 그리고 값 7이 있으므로 x가 값 7을 사용합니다. 짧은 x = 3; x = (짧은) (x + 4.6);
답변
네,
기본적으로 우리가 쓸 때
i += l;
컴파일러가 이것을 변환합니다
i = (int)(i + l);
나는 단지 .class 파일 코드를 확인했다.
정말로 알아야 할 좋은 일
답변
i = i + l의 경우 명시 적으로 int ~ int로 캐스팅해야합니다. 그런 다음 컴파일하고 올바른 출력을 제공합니다.처럼
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을 추가 할 때,
- The int object is casted to long & both are added and you get long object.
- but long object cannot be implicitly casted to int. So, you have to do that explicitly.
그러나 + =는 타입 캐스팅을하는 방식으로 코딩됩니다.i = (int) (i + m)
출처:https://stackoverflow.com/questions/8710619/why-dont-javas-compound-assignment-operators-require-casting
최근댓글