2015-01-27 6 views
3

다음 코드가 있습니다. 이것은 내가 그것을 이해하는 방법입니다.Java 삼항 연산자 구문

첫 번째 경우 x=4 및 인쇄 문을 5 예상대로 인쇄하기 때문에 첫 번째 경우 y 값을 반환합니다.

두 번째 경우에서 삼항 연산자는 먼저 y 값을 x에 할당 한 다음 해당 값을 반환합니다. 다시 예상대로 5를 인쇄합니다. : 오른쪽 및 x=z : 3 경우

는 삼원 작업자는 좌측의 x=y있다. 나는 이것이 제 2의 경우와 같이 행동 할 것으로 기대합니다. 그러나이 문장은 컴파일되지 않습니다.

이해에 도움이 될 것입니다.

public class Test { 

    public static void main(String[] args) { 
     int x = 4; 
     int y = 5; 
     int z = -1; 

     x = (x == 4) ? y : z;  // compiles and runs fine 
     System.out.println(x + " " + y + " " + z); 

     x = (x == 4) ? x = y : z; // compiles and runs fine 
     System.out.println(x + " " + y + " " + z); 

     x = (x == 4) ? x = y : x = z; // Does not compile 
     System.out.println(x + " " + y + " " + z); 
    } 
} 
+1

'x = (x == 4)? (x = y) :(x = z); 또는 x = (x == 4)? x = y : (x = z); . – Tiny

답변

5

할당 삼항 표현보다 낮은 우선 순위를 가지고, 그래서이 식 :

(x==4)?x=y:x = z; 

는 다음과 같이 생각할 수있다 : '당신이 할 수 있기 때문에

((x==4)?x=y:x) = z; 

분명히 컴파일되지 않습니다 변수가 아닌 것에 값을 할당하십시오.

2

하는 평가 순서

x = (x == 4) ? (x = y) : (x = z); // Does compile. 

상기 주을 제어하는 ​​괄호를 추가하면 (부작용으로) x에 값을 할당하는 할당한다 어느

if (x == 4) { 
    x = (x = y); 
} else { 
    x = (x = z); 
} 

동등 x ~ x에 할당 된 값입니다. 즉, 당신의 원은

x = (x == 4) ? y : z; 

또는

if (x == 4) { 
    x = y; 
} else { 
    x = z; 
} 

터너는 JLS-15.25. Conditional Operator ? :에 지정된 동일합니다.