Java 언어 사양에 변수의 이전 값을로드하도록 지시하는 항목이 있는지 확실하지 않습니다 ...
있습니다. 당신이 사양의 말씀 불분명 다음 번에, 사양을 읽어 주시기 바랍니다 다음 이 명확하지 않은 경우 질문.
... 오른쪽 (x = y)
대괄호로 암시 된 순서로 먼저 계산해야합니다.
그 진술은 거짓이다. 괄호는 평가 순서를 의미하지 않습니다 . Java에서 괄호에 관계없이 평가 순서는 왼쪽에서 오른쪽입니다. 괄호는 하위 식 경계가 평가 순서가 아닌 위치를 결정합니다.
첫 번째 표현은 왜 거짓으로 평가되고 두 번째 표현은 참으로 평가됩니까?
에 대한 규칙 ==
연산자 은 다음과 같습니다. 왼쪽을 평가하여 값을 생성하고, 오른쪽을 평가하여 값을 생성하고 값을 비교하면 비교는 표현식의 값입니다.
다시 말해, 의미 expr1 == expr2
는 항상 작성 temp1 = expr1; temp2 = expr2;
하고 평가 한 것과 동일 temp1 == temp2
합니다.
=
왼쪽에 로컬 변수가 있는 연산자 의 규칙은 다음 과 같습니다. 왼쪽을 평가하여 변수를 생성하고, 오른쪽을 평가하여 값을 생성하고, 할당을 수행하며, 결과는 지정된 값입니다.
함께 정리 해보자.
x == (x = y)
비교 연산자가 있습니다. 왼쪽을 평가하여 값을 x
만듭니다. 현재 값은 입니다. 우변을 평가하십시오 : 그것은 할당입니다 그래서 우리는 변수를 생성하기 위해 좌변을 평가합니다-변수 x
-우변을 평가합니다-의 현재 값 y
-에 할당 x
하고 결과는 할당 된 값입니다. 그런 다음 원래 값을 비교합니다x
할당 된 .
당신은 (x = y) == x
운동으로 할 수 있습니다 . 다시 한 번, 왼쪽을 평가하는 모든 규칙은 오른쪽을 평가하는 모든 규칙보다 먼저 발생한다는 것을 기억하십시오 .
(x = y)를 먼저 평가 한 다음 x를 자체와 비교하고 (3) true를 반환합니다.
Java 규칙에 대한 잘못된 믿음을 기반으로합니다. 바라건대 이제는 올바른 믿음을 가지고 있으며 앞으로는 참된 일을 기대할 것입니다.
이 질문은 "Java 표현식에서 하위 표현식의 평가 순서"와 다릅니다
이 진술은 거짓이다. 그 질문은 완전히 독일입니다.
x는 분명히 '하위 표현'이 아닙니다.
이 진술은 또한 거짓입니다. 각 예에서 두 번의 하위 표현식 입니다.
'평가'하기보다는 비교를 위해로드되어야합니다.
나는 이것이 무엇을 의미하는지 전혀 모른다.
분명히 당신은 여전히 많은 거짓 신념을 가지고 있습니다. 나의 충고는 당신의 거짓 신념이 진정한 신념으로 대체 될 때까지 사양을 읽는 것입니다.
이 질문은 자바에 특화되어 있으며 까다로운 인터뷰 질문을 위해 일반적으로 제작 된 파렴치한 비현실적인 구성과 달리 표현 x == (x = y)는 실제 프로젝트에서 나왔습니다.
표현의 출처는 질문과 관련이 없습니다. 이러한 표현에 대한 규칙은 명세서에 명확하게 설명되어 있습니다. 읽어!
비교 및 교체 관용구를 한 줄로 대체해야했습니다.
한 줄로 교체하면 코드를 읽는 독자에게 많은 혼란이 생겼으므로 선택이 잘못되었다고 제안합니다. 코드를 더 간결하지만 이해하기 어렵게 만드는 것은 승리가 아닙니다. 코드를 더 빨리 만들지 않을 것입니다.
또한, C 번호가있다 비교 대체 라이브러리 방법으로 할 수 있는 기계 명령어까지 jitted한다. Java 유형 시스템에서는 표현할 수 없으므로 Java에는 그러한 메소드가 없다고 생각합니다.