sourcecode

Java의 +=, -=, *=, /= 복합 할당 연산자가 캐스팅을 요구하지 않는 이유는 무엇입니까?

copyscript 2022. 7. 31. 22:18
반응형

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는 1회만 평가됩니다.

§ 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 Language 사양이 제안 내용을 확인합니다.

예를 들어, 다음 코드가 맞습니다.

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을 더하면

  1. int 객체가 long으로 캐스팅되고 둘 다 추가되면 long 객체가 됩니다.
  2. 단, 롱 오브젝트는 암묵적으로 int에 캐스트할 수 없습니다.그래서 당신은 그것을 명시적으로 해야 합니다.

그렇지만+=타이프 캐스팅 방식으로 코드화되어 있습니다. i=(int)(i+m)

Java 타입 변환은 할당 조작의 우측에 있는 식 타입을 할당의 좌측에 있는 변수 타입으로 안전하게 승격할 수 있는 경우에 자동적으로 실행된다.따라서 다음 사항을 안전하게 할당할 수 있습니다.

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

그 반대로는 같은 일이 일어나지 않을 것이다.예를 들어 long은 int로 자동 변환할 수 없습니다.long은 2번째보다 더 많은 스토리지를 필요로 하기 때문에 결과적으로 정보가 손실될 수 있습니다.이러한 변환을 강제하려면 명시적인 변환을 수행해야 합니다.
- Conversion ( - 변 type

때때로, 그러한 질문은 면접에서 할 수 있다.

예를 들어, 다음과 같이 입력합니다.

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

자동 타이프 캐스팅은 없습니다. 상기의 코드를 하는 만, 에서는, C++ 의 에러, 「C++ 의 에러」, 「C+ 의 에러」, 「C+ 의 에러」등의 메세지가 됩니다.Incompatible type exception.

이 문제를 피하려면 다음과 같이 코드를 작성해야 합니다.

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

가장 큰 차이점은 와의 차이입니다.a = a + b타이프 캐스팅이 진행 중이 아니기 때문에 컴파일러가 타이프 캐스팅을 하지 않은 것에 대해 화를 냅니다. ,가 있으면a += b 캐스팅입니다.b이 있는 a 하면

int a=5;
long b=10;
a+=b;
System.out.println(a);

실제로 하고 있는 일은, 다음과 같습니다.

int a=5;
long b=10;
a=a+(int)b;
System.out.println(a);

여기서 미묘한 점은...

에 대해 암묵적인 타입캐스트가 있다.i+jj과 2중으로 되어 있습니다.i는 int 입니다.Java는 항상 정수를 이중으로 변환합니다.

하기 i+=j서 ''는i입니다.j는 2배수를 할 수 있습니다.

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

참조: 암묵적 캐스팅에 대한 설명

를 하는 .j로로 합니다.(int)이 경우는 알기 쉽게 하기 위해서입니다.

Java Language Specification은 가 의 종류이며 한 번 평가되는 것과 동등하도록 정의합니다.

그것은 기술적인 답변이지만, 당신은 왜 그것이 사례인지 궁금할 수 있다.자, 다음 프로그램을 생각해 봅시다.

public class PlusEquals {
    public static void main(String[] args) {
        byte a = 1;
        byte b = 2;
        a = a + b;
        System.out.println(a);
    }
}

이 프로그램은 무엇을 인쇄합니까?

3개 맞혔어요?안타깝네요. 이 프로그램이 컴파일되지 않아요. 왜요?Java에서의 바이트 추가는 를 반환하도록 정의되어 있습니다.이는 Java Virtual Machine이 바이트 코드에서 절약하기 위해 바이트 연산을 정의하지 않기 때문이라고 생각합니다(결국 바이트 코드의 수는 한정되어 있습니다). 대신 정수 연산을 사용하는 것은 언어로 표시되는 구현 세부 사항입니다.

, 만약 ★★★★★★★★★★★★★★★★.a = a + b된다, 안 , 안 된다, 안 된다a += b 경우 하지 않습니다.E1 += E2 was was was was was was was로 정의되었습니다.E1 = E1 + E2앞의 예에서 알 수 있듯이, 실제로도 그렇습니다.+=연산자는 바이트와 쇼트용으로 동작합니다.이치노대단한 해킹은 아니지만, Java 1.0의 작업 기간에는 우선 언어를 공개하는 데 초점을 맞췄습니다.현재 하위 호환성 때문에 Java 1.0에서 도입된 이 해킹은 제거할 수 없습니다.

언급URL : https://stackoverflow.com/questions/8710619/why-dont-javas-compound-assignment-operators-require-casting

반응형