2014-07-13 3 views
2

기본적으로이 문은 "OR"을 사용하지 않고 "AND"를 사용하여 완벽하게 작동하는 논리를 이해하는 데 어려움을 겪고 있습니다. 논리가 Y 또는 y가 같거나 N 또는 n이 같으면 작동해야합니다. 하지만 이것을 사용하면 무한 루프가됩니다. 코드 블록은 아래에서 볼 수 있습니다.누군가가이 문이 왜 AND가되어야하는지 설명 할 수 있습니까?

 response = "empty"; 
     while (!response.equals("Y") && !response.equals("y") && !response.equals("N") && !response.equals("n")) 
     { 
      response = stdin.next(); 
      if (!response.equals("Y") && !response.equals("y") && !response.equals("N") && !response.equals("n")) { 
       System.out.println("Try again, you're still in the loop!"); 
      } 
      else { 
       System.out.println("Congratulations you're out the loop!"); 
      } 

     } 
    } 

누구나 내게 설명 할 수있는 논리적인 이유는 무엇입니까? 사용할 수 없지만 & &은 완벽하게 작동합니다. 나머지 코드 (스캐너 등은 위와 같지만 관련이 없으므로 스캐너를 포함하지 않습니다). 감사합니다.

+4

사용할 수있는'equalsIgnoreCase()'. –

+0

[String.equalsIgnoreCase (String s)'] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#equalsIgnoreCase%28java.lang.String%)을 소개하겠습니다. 29). 그것은 당신을 위해 깔끔한 것들을 조금합니다. – indivisible

+0

if 문이 이해가되지 않습니다. 당신은 상관없이 반복합니다. – Brian

답변

4

당신은 나 함께 할 수

while (!(response.equalsIgnoreCase("Y") || response.equalsIgnoreCase("N"))) 

그것은 De Morgan's Law를 불렀다

(!A && !B && !C) is equivalent to !(A || B || C) 

입니다.

또한, 한 곳에서만 조건을 가지고 더 나은 것 :

response = stdin.next(); 
while (!(response.equalsIgnoreCase("Y") || response.equalsIgnoreCase("N"))) 
{ 
    System.out.println("Try again, you're still in the loop!"); 
    response = stdin.next(); 
} 
System.out.println("Congratulations you're out of the loop!"); 
+0

참조 용으로 "DeMorgan 's Law". – Rogue

+0

@Rogue 귀하의 의견을 보내 주셔서 감사합니다. 추가 된 참조 – Eran

+0

수학 부분이 수정되었지만 그의 케이스가 작동하지 않는 이유에 대해 설명하지 않았습니다. 주로 질문입니다 – Fawar

0

그것은 당신이 Y로하지 응답을 원하기 때문에이다, 아니다 Y 나 N이나 N. 논리를 충돌 할

수행 또는 ||는 Y를하는 경우가 있으므로 y를하지 않거나 문이 모든 시간에 진실 할 것

|| 진정한 반환있다. X와

사실은 Y,도 Y,도 N,도 N 하지 않을 것이기 때문에 그래서 True or True 또는 True 또는 True == True

당신이 조건 중 하나를 넣을 경우 (Y, Y, N , N) 을 true 또는 true 또는 false (여러 순서로) == true

0

이 코드를 향상시키기 위해 할 수있는 일이 많이 있습니다. 고려하십시오

response = stdin.next(); 
while (!response.equalsIgnoreCase("y") || !response.equalsIgnoreCase("n")) 
{ 
    System.out.println("Try again, you're still in the loop!"); 
    response = stdin.next();     
} 
System.out.println("Congratulations you're out the loop!"); 

@ Eran의 대답이 논리가 잘못된 이유를 설명합니다.

0

&& 호출 된 논리 AND 연산자. 두 피연산자가 모두 0이 아니면 조건은 참이됩니다.

|| 호출 된 논리 OR 연산자. 두 피연산자 중 하나가 0이 아닌 경우 조건은 참이됩니다.

enter image description here

관련 문제