2016-07-10 10 views
-2

내 질문에 대한 답변은 someObject.methodReturnsInteger().getClass()입니다. (사실 getClass 메쏘드가 아닙니다.) Integer와 작동하는 그냥 방법이고, 실제로는 그렇지 않습니다. Integer를 반환하는 메서드를 의미합니다.) 그러나 이것은 ++a++입니까?자바에서 단항 연산자와 접두어를 동시에 사용

즉, 구문 분석 (또는 토큰 화)이 처음에는 반환 값을 허용하지만 두 번째에는 반환하지 않는 이유는 무엇입니까? 내 말은, 후자를 이렇게 파싱해서는 안되며 : (++a)++ 그리고 ++a을 숫자로 사용 하시겠습니까? 나는 질문이 충분히 명확 바랍니다 a+++++b

:

같은

는 같은 간다.

감사합니다.

답변

2

++a++가 추가 괄호 강조 3 개로 이루어져 식 : (++(a))++ :

자바 독 말한다 :

[X] 숫자 타입, 또는 오류가 발생 컴파일시에 전환하는 타입 (§5.1.8)의 변수이어야한다. [...] [접두사/접미사] 증분 표현 의 결과은 변수가 아니며 값은입니다.a 변수이지만, 때문에

그래서, 당신의 표현 ++a 작품, 결과가 , 그래서 (++a)++이 작동하지 않습니다.


a+++++b

그것이 ((a++)++)+b로 컴파일러에 의해 해석되기 때문에 작동하고, 우리가 배운대로, X++ 변수를 필요로하지 않습니다.

Java 토큰 화가가 유효한 연산자를 형성하기 위해 최대한 많은 연속 문자를 사용하기 때문에이 방법으로 구문 분석됩니다.

이제 공백이나 괄호를 추가하면 해당 표현식의 의도에 따라 작동 할 수 있습니다. 다음은 모두 동일합니다

(a++)+(++b) 
a+++(++b) 
a++ + ++b 
a+++ ++b 

표현 someObject.methodReturnsInteger().getClass()은 "method chaining"로 알려져있다.

.는 왼쪽 연관 method invocation 운영자이며, .의 왼쪽에있는 값은 단지 객체 일 (정적 메소드 호출 또는 클래스 만의 그를 건너 뛸)하기 때문에이 작동합니다.

그래서 표현은 다음과 같이 해석한다 :
(someObject . methodReturnsInteger()) . getClass()

첫 번째 . 작품을 someObject 객체이기 때문이다. 두 번째 .은 괄호로 묶인 표현식의 결과가 개체이기 때문에 작동합니다.

메서드 체이닝은 매우 일반적이며 builder pattern을 사용할 때 매우 좋습니다.

String s = new StringBuilder() 
     .append("Hello ") 
     .append(person.getFirstName()) 
     .append(", please say hello to your father, ") 
     .append(person.getFather().getFirstName()) 
     .append(".") 
     .toString(); 
1

작업 저장 값을 넣을 장소가 필요합니다. 식 (a*2)이 임시 결과를 반환하기 때문에 (a*2)++이라고 말할 수 없습니다. 임시 결과가 즉시 삭제되므로 영향을 미치지 않습니다. 같은 이유로, (a*2)=10을 말할 수 없습니다.

이 조금 더 의미가 ++(a*2) 말을 할 수 있지만, 여전히 당신이 그것을 넣어 유효한 곳이 없을 때 증가 된 값을 저장할 것을 나타냅니다 때문에 언어 디자이너 오히려 대신 (a*2)+1을 작성합니다 .

수정 후 수정 전 증가 연산자 은 임시 결과를 반환하기 때문에 두 번 또는 조합으로 적용 할 수 없습니다.

+0

@SotiriosDelimanolis @SotiriosDelimanolis는 '정수'참조로 변환되기 전에 32 비트 정수량 인 'int'입니다. 이것은 'Object'가 아닌 원시 타입입니다. Java는'int'를'Integer' 객체와 자동으로 변환하는 경우가 많습니다. 대부분 객체가 더 잘 작동하도록 만듭니다. 참조 : https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html –

+0

@SotiriosDelimanolis, Ah, 사실입니다. 다른 종류의 암시 적 캐스트없이 시도하지 않았습니다. 나는 그 부분을 제거 할 것이다. –

2

++ 연산자는 숫자에 대해 작동하지 않으며 변수에서 작동합니다. x이 변수이므로 x++이 허용됩니다. (x++)의 결과가 변수가 아니기 때문에 ++(x++)과 같은 것이 허용되지 않습니다.