2014-03-03 5 views
4

나는 지금 다음 코드 조각을 보았을 때 자바를 공부 중이다. 일반적인 삼항 연산자 (예 : 아래 "부울 a"로 시작하는 줄)가 어떻게되는지 이해하지만 '부울 b'로 시작하는 행에서 표현식을 읽는 방법을 이해할 수 없습니다. 이 행을 읽는 방법에 대한 도움은 매우 감사하겠습니다! 감사! 이 같은자바 다중 삼항 연산자

public class Ternary{ 
    public static void main (String[] args){ 
     int x = 10; 
     int i = 2; 
     boolean a = x > 10 ? true: false; 
     boolean b = a = true ? ++i > 2 ? true:false:false; 
     System.out.print(b); 
    } 
} 
+2

운영자 우선 순위에 대한 자세한 내용은 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html을 참조하십시오. 나는 당신을 생각합니다. 그 코드는 결코 터무니 없습니다. –

+0

삼항 연산자의 형식은 다음과 같습니다 (조건이 true 일 때 condition? result : 조건이 false 일 때 결과). 여기서는 부울 a를 정의한 다음 삼항 연산자의 결과를 대입합니다. –

답변

5

브레이크 그것을 :

true ? (++i > 2 ? true 
       : false) 
    : false; 

는 그래서 여기에 테스트 조건은 항상 true로 설정됩니다. 따라서 실행하는 삼항 분기는 ++i > 2 ? true : false 부분입니다.

이것은 단순히 증분 후 i2보다 큰지 확인합니다. 그렇다면 true을 반환합니다. 그렇지 않으면 false을 반환합니다.

이 전체 표현은 실제로 불필요하게 복잡합니다. 단순히 같이 쓸 수있다 :

boolean b = a = (++ i > 2); 

그러나 코드는 아마도 논리적으로이 난해한 표현이 훨씬 이해가되지 않기 때문에 잘못된. 이전 줄은 a의 값을 설정 했으므로 다음 줄은 실제로 a을 테스트 할 것으로 가정합니다. 그래서 실제 의도는 다음과 같을 수 있습니다

boolean b = a == true ? ++i > 2 ? true : false : false; //notice the == 

경우에 당신은로 분리 할 수 ​​있습니다 :

(a == true) ? (++i > 2 ? true 
         : false) 
      : false; 

하지만 당신은 그래서 당신이 실제로 a 이후 a == true 이미 boolean입니다 수행 할 필요가 없습니다 수행 할 수 있습니다

a ? (++i > 2 ? true 
      : false) 
    : false; 

를 여기서, atrue 있는지 여부를 확인합니다. 존재한다면, 그것은 이미 넘어 갔는지 (즉, i의 증가 된 값이 2보다 큰지를보기 위해) 확인을 수행하고, 그렇지 않으면 false을 반환합니다.

그러나 심지어이 복잡한 표현

는 그냥 간단하게 할 수 있습니다

boolean b = a && (++i > 2); 
+0

마지막 허위는 어떨까요? 그것은 진리표를합니까? T v F = T? – Brian

+0

테스트가 항상 'true'이기 때문에 마지막'false'는이 경우 평가되지 않습니다. –

+0

아, 이제 알겠습니다. – Brian

0

boolean b = a = true ? ++i > 2 ? true:false:false;에서 다음과 같은 상황이 발생합니다

a = true 

atrue 값을주고 true로 평가됩니다.

++i > 2보다 이 더 많습니다.이 경우에도 마찬가지입니다. 결과는 true입니다.

1

아! 그런 식으로 코드를 작성하지 마십시오. 하지만 그건 당신이 쓴 것이 아니라고 생각합니다.하지만이처럼 읽을 수 있습니다

으로 더 나눌 수 있습니다
// I assume that's `a == true` instead of `a = true` 
boolean b = a == true ? (++i > 2 ? true : false) 
         : false; 

:

추가로 분류 할 수
// a == true is better written as just `a`. You shouldn't do boolean comparison 
// like that. 
boolean b = a ? (++i > 2) : false; 

// If that is really a = true, then you can break it as: 
boolean b = a = true ? (++i > 2) : false; 

:

// If that is `a == true` 
boolean b = a && (++i > 2) 

// If that is really a = true, then you can break it as: 
boolean b = a = (++i > 2); 

또한, 제 과제 :

boolean a = x > 10 ? true: false; 

ca

boolean a = x > 10; 
+0

나는 이것이 정확하다고 생각하지 않는다. 'boolean b = a = true'가 정확합니다; 결과를'a'와'b' 둘 다에 할당하는 것입니다. –

+0

a == true는 좋지 않지만 a에 true를 지정하지 않습니다. –

+0

FYI, IntelliJ는'boolean b = a = ++ i> 2;'로 단순화했습니다. –

0

삼항 연산자의 (a 사실 동일하기 때문에)

조건 다음 true 또는

거짓 조건은 항상 참이다 : N도 같이 쓸 수.

그러면 ++ i가 2보다 큽니다 (결과는 3입니다).

따라서 b에 true를 할당합니다. 조건이 거짓이면 false를 지정합니다. 거짓은 마지막 거짓으로부터 배정됩니다.

0

괄호을 사용하면 다음과 같이 코드를 검토하는 데 도움이됩니다.

boolean b = a = (true ? (++i > 2 ? true : false) : false); 

당신은로 생각할 수 : 2 항상 실행됩니다 : 번호 경우 if(true)Tautology입니다

if (true) // # If Number:1 
{ 
    if (++i > 2) // # If Number:2 
    { 
     a = true;    
    } 
    else { a = false; } 
} 
else { a = false; } 

. 따라서; 그것은된다;

if (++i > 2) 
{ 
    a = true;    
} 
else { a = false; } 

; a = (++i > 2) ? true : false);이며 인 a = ++i > 2++i > 2입니다.

0

끔찍한 코드!

그렇지 않으면 이전의 라인이 쓸모없는 과제이기 때문에 b = a = true ? ...의 (a는 읽어 본 적이있다), b = a == true ? ...해야한다는 단서 몇 가지, 그리고 라인의 마지막 false는 도달 할 수없는 코드가된다. 컴파일러가 알려줄 것입니다. 내가 가정에 대답하는거야

== 수정 -하지만 당신은 당신의 부분에 오타, 신뢰할 수없는 소스, 또는 '버그를 발견'테스트 여부를 알고 같은 기술을 사용할 수 있습니다 당신이 좋아하는 코드라도.

트릭은 단계별로 리팩터링하는 것입니다. 먼저 우선 순위 규칙에 따라 대괄호와 들여 쓰기를 추가합니다.

b = a == true ? ++i > 2 ? true:false:false; 
... becomes ... 
b = (a == true) 
      ? (++i > 2 ? true:false) 
      :false; 

다음 참고한다 :

  • a == truea는 동일하다.
  • boolean x = a ? true : false;boolean x = a과 같습니다.

따라서 :

b = a 
    ? (++i > 2) 
    :false; 

나 :이 경우

b = a && (++i > 2); 

는 "심각한"코드는이 문제를 접근하는 방법은 모든 다루 단위 테스트 세트를 작성하는 것 가능한 입력 케이스. 그런 다음 코드를 변경하지 않을 때마다 테스트를 다시 실행할 때마다 이러한 리팩토링을 한 번에 하나씩 수행하십시오.

true 또는 false 리터럴이 축소 된 형식으로 표시되지 않습니다. 삼항 연산에서 부울 리터럴을 보거나 (실제로는 부울 값에 대한 삼항 표현식) 코드가 냄새입니다. 비 3 진 버전은 일반적으로 더 간단하고 명확하기 때문입니다. 시도되는 내용에서 몇 가지 추측과 일부 변수 이름 바꾸기와

shippingPrice = orderTotal >= freeShippingThreshold ? 0 : getStandardShipping(); 
0

하고 a = true 가정 :

삼항 표현은 의도되지 않은 부울 출력에 부울 조건을 매핑 목적을 위해 매우 유용합니다 a == true 될 예정이었다 당신이 얻을 :

boolean failed = result > 10 ? true: false; 
    boolean b = failed ? ++retries > 2 ? true:false:false; 

이는 훨씬 더 논리적까지 정돈 할 수 있습니다

boolean failed = result > 10; 
    boolean giveUp = failed && ++retries > 2;