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.