오늘 생각해봤죠 때까지 그 예를 들면 다음과 같습니다.
i += j;
그냥 바로 가기 위한:
i = i + j;
만약 지금 이거 드세요.
int i = 5;
long j = 8;
그럼 내가 + i = + = '난' j 'j' 가 아니라, 컴파일하십시오 좋았소 컴파일하십시오 않습니다.
'난' 은 과연 짓궂군요 실제로 이 같은 일이 단축키를 + = j. 'i (i + j) = (type i)'?
언제나 그렇듯이 이 질문, JLS 해답이야 가지고 있다. 이 경우 [& # 167, 15.26.2 복합 대입 연산자] [1]. 추출을:
>. 할당에서는 표현식에서는 복합 형태의 code>, op = & E2< nbsp;;;;; 빨리 < E1& /code>; <;;;;; = & 해당하는 code> E1& 빨리 빨리 (T) (, 빨리, 빨리 op& & (E1), (E2)), 여기서 'T', 'E1 은 < /code> 유형', 'E1' 검사됩니다 단 한 번만.
예를 들어 [& # 167, 15.26.2] [1] 에서 인용
>. [.] 다음의 코드는 올바른:
>. 파선-짧은 x = 3. x + = 4.6.
>. 그 결과 값을 갖는 것이 있기 때문에 x 7 에 해당하는 것이다.
>. 파선-짧은 x = 3. >. x = (파선-짧은) (x + 4.6).
즉, 당신의 가정을 올바릅니다.
[1]: http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html # jls-15.26.2
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 언어로 사양명세] [1] 확인되고 있는 제안이다.
>. 예를 들어, 다음의 코드는 올바른: >. >. >. 파선-짧은 x = 3. >. x + = 4.6. >. >. 그 결과 값을 갖는 것이 있기 때문에 x 7 에 해당하는 것이다. >. >. >. 파선-짧은 x = 3. >. x = (파선-짧은) (x + 4.6).
[1]: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html # jls-15.26.2
예.
기본적으로 우리가 쓰기
i += l;
컴파일러는 이 변환됩니다.
i = (int)(i + l);
그냥 '코드' 리클레스 파일 확인했습니다.
정말 알아야 할 좋은
긴 '을' 에서 '나라를 위해 필요한 경우 int' l '+' 는 '에서' i = 내가 직접 주고 컴파일하십시오 그런 것이 올바른 출력입니다. 같은
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.
하지만 이런 '+ =' 에서 암시적으로 높여줍니까 유형: 캐스팅 때문에 그냥 작동합니다 연산자에서 유형의 오른쪽 왼쪽 가변으로 가변적입니다 입력할 수 있어 캐스트 명시적으로 필요가 없습니다.
자바 가상 머신 (jvm) 에 수행합니까 유형 변환 시 자동으로 유형의 표현식에서는 오른쪽에 있는 지정 작업이 안전하게 프로모트됩니다 유형의 가변으로 왼쪽의 할당에서는. 따라서 우리는 할당할지 것이 안전합니다. < pre>; > 바이트입니다 -; > 파선-짧은 -; int - >. 긴 - >. 부동 소수점 - >. 이중. < /pre>; 다른 방법으로 바라보고 같은 작동하지 않습니다. 예를 들어 우리는 보다 많은 스토리지를 필요로 하기 때문에 오랜 충족되었으며 int 첫 번째 자동으로 변환할 수 없는 두 번째 따라 정보를 모두 잃을 수 있습니다. 이러한 변환을 수행하는 강제로 명시적인 변환 해야 한다. 유형 - 변환
가끔 이런 질문을 회견에서 질문을 받을 수 있습니다.
예를 들어, 기록할 때:
int a = 2;
long b = 3;
a = a + b;
자동 타입 캐스팅 없다. C++에서 없을 수 있지만, 모든 오류 컴파일하기를 위의 코드는 자바 가상 머신 (jvm) 에 호환되지 않는 유형: idfsysobject. 'like' 뭔가를 얻을 수 있습니다.
이 같은 코드를 작성하는 이를 피할 수 있도록 합니다.
int a = 2;
long b = 3;
a += b;// No compilation error or any exception due to the auto typecasting
주된 차이점은 없다 ',' a = a + b 타입 캐스팅 예정에 있는 등, 컴파일러는 타입 캐스팅 화낼 dell. 너회가 하지 않았다. 뿐만 아니라 '= a + b', 'b' 는 위선으로 it& # 39, 어떤 유형에 대한 'a' s 타입 캐스팅 정말 호환됩니까. 이렇게 할 경우
int a=5;
long b=10;
a+=b;
System.out.println(a);
어떤 일을 하고, 정말 you& # 39 입니다.
int a=5;
long b=10;
a=a+(int)b;
System.out.println(a);
여기에 미세한 점.
There is an 암시적입니다 캐스트 i+j 'j' 는 '을 (를) "에 대한 이중,' i '는 int.
I+ 명확히 할 수 있는 'j' j '는' = '난' 은 정수 및 연산뿐 설명할 수 있다
i = <int>(<double>i + j)
참조: [이 설명을 암시적입니다 캐스팅] [1]
캐스트 'j' 를 할 수 있습니다 ' (int)' 이 경우 명확성을.
[1]: # 임플리치스컨베르시온 pattis/15-1XX/15-200/lectures/voe/lecture.html ~ https://www.cs.cmu.edu/
Java 언어로 사양명세 [eventtest 'E1 op = E2' 을 상당할 'E1 = (T) ((E1) op (E2))' 어디서 'T' 일종의 'E1' 와 'E1' 한 번 검사됩니다] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html # jls-15.26.2).
public class PlusEquals {
public static void main(String[] args) {
byte a = 1;
byte b = 2;
a = a + b;
System.out.println(a);
}
}
이 프로그램은 인쇄하십시오 무엇입니까?
아마 3 계신가요? # 39, t, 이 프로그램은 너무 나쁜 won& 컴파일하십시오. 왜? 뭐, 그렇게 하면, 그리고 바이트입니다 자바 가상 머신 (jvm) 에 있는 [정의되어 있는 '반환되기를 int'] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html # jls-5.6.2). 이 때문에, I believe 는 Java Virtual Machine, t # 39 의 doesn& 정의하십시오 바이트입니다 운영체 저장하라는 바이트코드가 (그 후, 제한된 수의 있습니다 모든) 을 구축할 수 있는 것이 아니라 어떤 정수 연산을 사용하여 상세함을 욕금지
A = a + b 'doesn& 신앙이니라', '= a + b' t work, 그렇게 되면 짓궂군요 # 39 의 경우 결코 작동합니까 E2 로 정의되는 'E1 = + = 바이트입니다 E1' 는 '+' E1, E2 될 경우, 그 이전 예제에서와 있다. 해킹을 할 수 있다 '+' 와 반바지, there is an 암시적입니다 캐스트 바이트입니다 연산자입니다 = 일하고 있었다. # 39 의 it& 않는 한 동안 해킹, 하지만 중요한 것은 자바 1.0 작동합니까 멋지구리해요 뒤로를 가져오던 언어 릴리즈됨 꼴입니다. 이제, 이 때문에, 해킹, Java 1.0 에 포함된 하위 호환성을 couldn& # 39 제거할 수 없다.