Java 7 이후로 하나의 표현식 만 평가하는 Java의 삼항 연산자-Java 1.6 이하에서는 달라졌습니까?


109

Oracle Certified Associate Java SE 8 Programmer 1 시험을 준비하면서 공식 학습 가이드에서 삼항 표현에 관한 다음 단락을 발견했습니다.

삼항 표현식 평가
Java 7부터는 삼항 연산자의 오른쪽 표현식 중 하나만 런타임에 평가됩니다. 단락 연산자와 유사한 방식으로 삼항 연산자의 두 오른쪽 표현식 중 하나가 부작용을 수행하면 런타임에 적용되지 않을 수 있습니다. 다음 예제로이 원리를 설명해 봅시다 : [...]

다음 예제를 통해 두 식 중 하나만 평가된다고 말합니다.

int y = 1;
int z = 1;
int a = y < 10 ? y++ : z++;

여기에서는 예상대로 y증가하지만 z그렇지 않습니다.

내가 걸려 넘어지는 것은 "As of Java 7 ..."이라는 단락의 시작 부분 (노란색으로 표시됨)입니다. Java 1.6으로 동일한 코드를 테스트했는데 동작의 차이를 찾을 수 없습니다. Java 1.6이 단락에 제공된 정보만으로 두 표현식을 모두 평가할 것으로 예상했습니다. "As of Java 7, ..."로 무엇을 말하고 싶은지 아는 사람이 있습니까?

편집 : 혼동을 피하기 위해 : 'As of Java 7'을 작성했기 때문에 Java 6에서 Java 7로 전환 할 때 삼항 연산자와 관련하여 변경된 것이 있습니까?


4
z도 증가 할 것으로 예상하는 이유는 무엇입니까? 이것은 나에게 의미가 없습니다.
에 Jiří 캔터

15
잘못 작성된 책 같은 소리, 삼항 연산자는 AFAIK, 자바의 beginging 이후 변경되지 않은
님 침 스키

23
지금까지 게시 된 대부분의 답변을 읽으면 사람들은 질문을 잘못 해석하는 것 같습니다. "왜 두 표현이 모두 평가되지 않습니까?"가 아니라 "이 책이 예전에 다르게 작동했음을 암시하는 것처럼 보이는 이유는 무엇입니까?"
BambooleanLogic

23
실제로 "현재 날짜 / 버전 X"는 "우리는 이것이 날짜 / 버전 X에서 사실인지 확인했지만 이전 버전에 대해서는 아무 말도하지 않았습니다."라는 의미로 사용되었습니다. 나는 그것이 여기에서 의미가 될 것이라고 생각합니다. (자바의 이전 버전을 확인하는 것이 충분히 쉬울 것이라고 생각할 수 있습니다.) 어쨌든, 그것은 프로그래밍 문제 라기보다는 영어 문제에 더 가깝습니다.
데이비드 Z

14
@DavidZ : 영어 문제는 작업 수행을 방해하는 프로그래밍 문제입니다. 이 형편없는 말로 인해 OP는 그가하고있는 일을 멈추고 아무것도 변경되지 않았 음을 발견하는 데 시간을 낭비했습니다. 프로그래밍은 컴파일러 / 인터프리터와 나중에 코드를 유지하기 위해 함께 오는 사람과의 커뮤니케이션입니다. 나는 내가 어떤 코드를 읽은 횟수를 셀 수없고, 문제와 관련이있을 수있는 이상한 무언가 때문에 멈춰야 만했다. 단지 그것이 잘못 "구문"되었다는 것을 알아 내기 위해서였다.
jmoreno 2014

답변:


92

저는이 책의 저자 중 한 명입니다. 내가 그 특정 문장을 작성하지는 않았지만, "이것은 Java 7에서 테스트되었습니다"라는 의도에 동의합니다. 우리가 다른 판을 작성하면 그것을 제거하도록 메모를 할 것입니다.

명확하게 말하면 삼항 연산자는 Java 8, 7, 6 등에서 동일한 방식으로 작동했습니다. 앞으로 변경 될 경우 상당히 놀랍습니다.


116

로부터 자바 6 JLS :

런타임에 조건식의 첫 번째 피연산자식이 먼저 평가됩니다. 필요한 경우 결과에 대해 unboxing 변환이 수행됩니다. 그런 다음 결과 부울 값을 사용하여 두 번째 또는 세 번째 피연산자 식을 선택합니다.

  • 첫 번째 피연산자의 값이 참이면 두 번째 피연산자식이 선택됩니다.
  • 첫 번째 피연산자의 값이 거짓이면 세 번째 피연산자식이 선택됩니다.

그런 다음 선택한 피연산자식이 평가되고 결과 값은 위에서 설명한 규칙에 따라 결정된 조건식의 유형으로 변환됩니다. 이 변환에는 boxing (§5.1.7) 또는 unboxing 변환이 포함될 수 있습니다. 선택하지 않은 피연산자 식은 조건식의 특정 평가에 대해 평가되지 않습니다.

1.0으로 돌아가는 JLS 에디션에도 비슷한 문구가 나타납니다 . 동작은 Java 7에서 변경되지 않았습니다. 스터디 가이드의 내용이 잘못되었습니다.


2
그래서 대답은 "삼항 연산자와 관련하여 Java 7 이전과는 차이가 없습니다"입니다. 맞습니까?
Mathias Bader 2015

5
합법적 인 것 같습니다. 나는 저자에 메모를 썼다 - 자신의 대답을 기대
마티아스 베이더에게

버전 간의 연산자 코드를 비교하는 URL을 찾을 수도 있습니다. 편집증 / 호기심이라면.
Steve Clay

7
이러한 Oracle 인증에서 잘못 쓰여진 (또는 그냥 틀린) 질문의 수가 다시 매번 놀랍습니다.
Voo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.