2012-12-12 3 views
1

나는이 내 코드에 다음 줄 :두 개의 if 문을 AND로 분리해야합니까?

if (command.equals("sort") && args.length == 2) { 
    //run some program 
    } 

누군가가 명령이 동일하지 않을 경우 다른 if 진술의 평가를 할 필요가 없기 때문에 두 개의 별도 if 문을 사용해야한다는 제안을 "종류" args 길이가 맞는지 여부에 관계없이.

그래서, 나는 내 코드를 다시 작성해야하는가에 따라 :

if (command.equals("sort")) { 
    if (args.length == 2) { 
    //run some program 
    } 
} 

나는 둘 다 일을 알고 있지만, 내 질문에 더 효율적 어느 쪽입니까?

+1

"누군가"는 Java의 단락 논리 연산자를 읽어야합니다. – GriffeyDog

답변

14

아니요, 사실이 아닙니다. 첫 번째 조건이 거짓으로 평가되면 두 번째 조건은 전혀 평가되지 않을 것이라고 그들은 short circuit이라고 부릅니다.

+0

동일한 바이트 코드로 컴파일 되었습니까? 즉, 가장 효율적인 방법은 무엇입니까? –

+2

AND 연산자를 사용하십시오. 코드를 더 쉽게 읽을 수 있기 때문입니다. WikiPedia의 "이러한 두 가지 경우의 컴퓨팅 효율면에서의 차이점은 사용 된 컴파일러 및 최적화 체계에 크게 달려 있으며 적절한 최적화를 통해 동일한 시스템 코드로 컴파일되므로 동일한 속도로 실행됩니다."http : //en.wikipedia.org/wiki/ Short-circuit_evaluation –

7

음, &&short-circuit 연산자입니다. 따라서 if 문은 모두 사실 동일합니다.

따라서 첫 번째 경우에 command.equals("sort")이 거짓을 반환하면 다음 조건이 전혀 평가되지 않습니다. 그래서, 제 의견으로는, 첫 번째 것을 가지고 가십시오. 그것은 분명하다.

1

이들은 동일합니다. 첫 번째 예를 들어, 첫 번째 표현식이 거짓이면 현대 런타임은 두 번째 표현식을 무시합니다.

+2

Java 언어 사양에는 단락 동작이 필요합니다. 그것은 런타임에 달려 있지 않습니다. –

+1

음, 런타임은 사양의 구현입니다. 맞습니까? 그래서 우리 둘다 맞습니다. :) –

+0

아니요, 당신이 '어떤 현대적'으로 자격을 부여했기 때문입니다. 모든 Java 구현은 날짜와 상관없이 지정된대로 동작해야합니다. 이 동작은 실제로 JVM이 아니라 컴파일러에서 발생합니다. – EJP

0

조건이 동일한 순서 인 경우 효율면에서 완전히 동일합니다.

if (command.equals("sort") && args.length == 2) 

command.squals ("sort")가 false를 반환하고 args.length가 확인되지 않으면 삭제됩니다. 운영자 &&의 운영자는 short-circuit입니다.

스타일과 가독성 문제가 있습니다. IMO 하나의 if 문장으로 너무 많은 체인을 시작할 때 읽기가 어려울 수 있습니다.

1

가치에 대해 null 사례를 확인한 다음 해당 개체에 함수를 적용하면 단락 연산자가 잘 작동하여 단락이 더 잘되는 &에 의해 수행하는 것이 좋습니다. 조건 1이 거짓이면 조건 ​​2에서 실행이 중지됩니다.

예 :

String s=null;

if(s!=null && s.length())

이 나던 던져 예외도 대부분의 경우 검사의 경우 더 하나를 저장합니다.

0

사실, [Lazy_evaluation]라고 : http://en.wikipedia.org/wiki/Lazy_evaluation 문제는 정말 아니지만 당신이 원하는 경우 평가하는 경우, 당신은 & 사용할 수 있습니다

+0

실제로는 그렇지 않습니다. 게으른 평가는 Java에서는 나타나지 않습니다. && 연산자의 실행은 언어 사양에 의해 완전히 정의되며 지연 평가와는 아무런 관련이 없습니다. – EJP

+0

사실 내가 단락 회로에 답장을하고 있었고, 필요하지 않은 조건의 일부가 평가되지 않았기 때문에 if 문 조건의 평가가 지연되었다는 것을 의미합니다. 나는 && 정확한 정의에 대해 말하지 않는다. – rduga

+0

@ruga 실제로 '게으른 평가'는 인용 한 기사에서 제공하는 것처럼 매우 정확한 정의를 가지고 있으며 자바에서는 발생하지 않는다. – EJP

0

:

if (methodA() & methodB()) { 
    // 
} 

대신

boolean a = methodA(); 
boolean b = methodB(); 
if (a && b) { 
    // 
} 
-1

예, 제안은 완전히 옳습니다. 첫 번째 수표를 다음과 같이 작성하는 것이 좋습니다.

"sort".equals(command) 

아마도이 경우에는 의미가 없지만 나중에는 의미가 있습니다. 먼저 정적 유형을 사용하십시오. 먼저 null 체크가 필요하지 않습니다.

+0

제안은 완전히 잘못되었습니다. * '그들'은 자바 언어 사양을 읽을 필요가 있습니다. – EJP

+0

예 ... 그 (것)들과 나는 다른 코멘트를 의미했다 : -) – boskop

2

설명 된 바와 같이, 단락으로 인해 조건이 충족되지 않는 경우 프로그램이 if 문을 종료하게되므로 추가 조건이 평가되지 않으므로 실제 값은 없습니다. 두 형식이 평가되는 방식의 차이.

여러 개의 if 문이 서로 중첩되어있을 때 코드 가독성에 부정적인 영향을 주며, 내게는 중첩하지 않는 것이 주된 이유입니다. 예를 들어 :

if(conditionA){ 
    if(conditionB){ 
     if(!conditionC){ 
      // Do Something 
     } 
    } 
} 

중첩 (20)의 경우 계산서를 가진 것을 상상해

if(conditionA && conditionaB && !conditionC){ 
    // Do Something 
} 

보다 훨씬 깨끗? 흔한 일은 아니지만 가능한 일입니다.