왜 Java의 + =, - =, * =, = = 복합 할당 연산자가 형 변환을 요구하지 않습니까?



Answers

이 캐스팅의 좋은 예는 * = 또는 / =을 사용하는 것입니다.

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'
Question

오늘까지, 나는 예를 들면 그것을 생각했다 :

i += j;

바로 가기입니다 :

i = i + j;

그러나 우리가 이것을 시도하면 어떨까요?

int i = 5;
long j = 8;

그러면 i = i + j; 컴파일하지는 않지만 i += j; 잘 컴파일됩니다.

사실 i += j; 이런 식의 바로 가기입니다 i = (type of i) (i + j) ?




때때로, 그러한 질문은 인터뷰에서 물을 수 있습니다.

예를 들어, 다음과 같이 작성할 때 :

int a = 2;
long b = 3;
a = a + b;

자동 형변환은 없습니다. C ++에서는 위 코드를 컴파일하는 데 오류가 없지만 Java에서는 Incompatible type exception 합니다.

그래서 그것을 피하려면 다음과 같이 코드를 작성해야합니다.

int a = 2;
long b = 3;
a += b;// No compilation error or any exception due to the auto typecasting



여기서 미묘한 점 ...

j 가 double이고 i 가 int 인 경우 i+j 대한 암시 적 타입 변환이 있습니다. Java는 항상 정수를 double로 변환합니다.

i+=j 를 명확히하기 위해 i+=j 는 정수이고 j 는 double입니다.

i = <int>(<double>i + j)

참고 : 암시 적 주조에 대한 설명

이 경우 명확하게하기 위해 j(int) 로 유형 변환 할 수 있습니다.




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

int와 long을 추가하면,

  1. int 객체는 long에 캐스팅됩니다. & both가 추가되고 long 객체를 가져옵니다.
  2. long 객체는 암시 적으로 int로 캐스트 될 수 없습니다. 그래서, 당신은 그것을 명시 적으로해야합니다.

그러나 += 는 형식 변환을하는 방식으로 코딩됩니다. i=(int)(i+m)




예,

기본적으로 우리가 쓸 때

i += l; 

컴파일러는 이것을 다음으로 변환한다.

i = (int)(i + l);

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

알아두면 좋은 것




Links