programing

Java의 3차 연산자는 Java 7 이후 하나의 표현식만 평가합니다. Java 1.6 이하에서는 다른가요?

prostudy 2022. 9. 11. 16:34
반응형

Java의 3차 연산자는 Java 7 이후 하나의 표현식만 평가합니다. Java 1.6 이하에서는 다른가요?

Oracle Certified Associate Java SE 8 Programmer 1 시험을 준비하던 중 공식 스터디 가이드의 삼원 표현에 대해 다음 단락을 발견했습니다.

삼원식 평가
Java 7에서는 3진 연산자의 오른쪽 식 중 하나만 런타임에 평가됩니다.단락 연산자와 유사한 방법으로, 3진 연산자의 2개의 오른쪽 식 중 하나가 부작용을 수행한다면, 런타임에는 적용되지 않을 수 있다.다음 예제를 사용하여 이 원리를 설명하겠습니다. [...]

2개의 식 중1개만 평가된다고 되어 있습니다.다음의 예를 나타냅니다.

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

여기만y증가하지만z예상하신 것처럼 그렇지 않습니다.

제가 우연히 발견한 것은 'Java 7의 경우'라고 써있는 단락의 첫 부분(노란색으로 표시됨)입니다.Java 1.6에서 같은 코드를 테스트했는데 동작의 차이를 찾을 수 없습니다.나는 Java 1.6이 문단에서 주어진 정보만으로 두 표현 모두를 평가할 것으로 기대했다."As Java 7..."에서 하고 싶었던 말이 뭔지 아는 사람?

편집: 혼동을 피하기 위해:결론부터 말하자면, 'Java 7의 경우'라고 쓰고 있는데, Java 6에서 Java 7로 전환할 때 3진 연산자와 관련하여 달라진 점이 있었습니까?

Java 6 JLS에서:

실행 시 조건식의 첫 번째 피연산자식이 먼저 평가됩니다.필요에 따라 결과에 대해 언박싱 변환이 실행됩니다.그 후 결과 부울값을 사용하여 두 번째 또는 세 번째 피연산자식을 선택합니다.

  • 첫 번째 오퍼랜드 값이 true이면 두 번째 오퍼랜드 식이 선택됩니다.
  • 첫 번째 오퍼랜드 값이 false일 경우 세 번째 오퍼랜드 식이 선택됩니다.

선택한 오퍼랜드 식이 평가되고 결과 값이 위에서 설명한 규칙에 의해 결정된 조건부 식 유형으로 변환됩니다.이 변환에는 박싱(55.1.7) 또는 언박싱 변환이 포함될 수 있습니다.선택되지 않은 피연산자 표현식은 조건식의 특정 평가에 대해 평가되지 않습니다.

1.0 이전의 JLS 에디션에서도 같은 문구가 사용되고 있습니다.Java 7에서는 동작이 변경되지 않았습니다.스터디 가이드의 문구가 서툴러졌을 뿐입니다.

저는 이 책의 저자 중 한 사람입니다.제가 그 문장을 쓴 것은 아니지만, 그 의도는 "이것은 Java 7에서 테스트되었습니다"였습니다.다른 판을 쓰게 되면 그것을 삭제하도록 메모해 두겠습니다.

확실히 하자면, 3진 연산자는 Java 8, 7, 6 등에서도 같은 동작을 하고 있습니다.그리고 만약 미래에 그것이 바뀐다면 나는 꽤 놀랄 것이다.

언급URL : https://stackoverflow.com/questions/29557106/ternary-operator-in-java-only-evaluating-one-expression-since-java-7-was-that

반응형