Java에서 부울 "작업 순서"는 무엇입니까?
객체의 간단한 예를 들어 봅시다 Cat
. "not null" cat
이 주황색 또는 회색 인지 확인하고 싶습니다 .
if(cat != null && cat.getColor() == "orange" || cat.getColor() == "grey") {
//do stuff
}
나는 AND가 먼저오고 그다음이 OR라고 믿습니다. 나는 약간 모호하므로 여기 내 질문이 있습니다.
어떤 일이 발생하는지 확신 할 수 있도록 누군가가이 진술을 안내해 줄 수 있습니까?
또한 괄호를 추가하면 어떻게됩니까? 작업 순서가 바뀌나요?
내 작업 순서가 언어에서 언어로 변경됩니까?
Java Tutorials에는 연산자 우선 순위를 보여주는 목록이 있습니다. 등호 연산자가 먼저 평가되고, 그 &&
다음 ||
. 괄호는 다른 것보다 먼저 평가되므로 추가하면 순서가 변경 될 수 있습니다. 이것은 일반적으로 언어마다 거의 동일하지만 항상 다시 확인하는 것이 좋습니다.
하루 종일 디버깅을 할 수있는 것은 예상치 못한 동작의 작은 변형이므로 평가 순서가 무엇인지 확신 할 수 있도록 괄호를 제자리에 두는 것이 좋습니다.
부울 연산 순서 (내가 믿는 모든 언어) :
- 괄호
- 아니
- 과
- 또는
따라서 위의 논리는 다음과 같습니다.
(cat != null && cat.getColor() == "orange") || cat.getColor() == "grey"
표현식은 기본적으로 다음과 동일합니다.
if ( (cat != null && cat.getColor() == "orange") || cat.getColor() == "grey") {
...
}
여기서 우선 순위는 AND ( &&
)가 OR ( ||
) 보다 우선 순위가 높습니다 .
또한 ==
문자열 동등성을 테스트 하는 데 사용 하는 것은 때때로 Java에서 작동하지만이를 수행하는 방법은 아님을 알아야합니다. 다음을 수행해야합니다.
if (cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) {
...
}
즉 , 단순히 동등성을 참조하는 것이 아니라 비교를 위해 equals()
방법을 사용합니다 . 문자열에 대한 참조 같음은 오해의 소지가 있습니다. 예를 들면 :String
==
String a = new String("hello");
String b = new String("hello");
System.out.println(a == b); // false
네, &&
확실히 전에 평가 ||
됩니다. 그러나 나는 당신이 cat.getColor() == "orange"
예상치 못한 결과를 줄 수 있는 일 을 하고 있는 것을 봅니다 . 대신 이것을 원할 수 있습니다.
if(cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) {
//do stuff
}
먼저 if 문에는 세 가지 주요 표현식이 포함됩니다.
- 고양이! = null
- cat.getColor () == "주황색"
- cat.getColor () == "회색"
첫 번째 표현식은 단순히 cat이 null이 아닌지 확인합니다. 그렇지 않으면 두 번째 표현식이 실행되고 NPE(null pointer excpetion)
. 이것이 첫 번째와 두 번째 표현식 사이에 &&를 사용하는 이유입니다. 를 사용할 때 &&
첫 번째 표현식이 false로 평가되면 두 번째 표현식이 실행되지 않습니다. 마지막으로 고양이의 색깔이 회색인지 확인합니다.
마지막으로 cat이 null이면 세 번째 표현식이 여전히 실행되고 따라서 null 포인터 예외가 발생 하기 때문에 if 문이 여전히 잘못 되었습니다 .
이를 수행하는 올바른 방법은 다음과 같습니다.
if(cat != null && (cat.getColor() == "orange" || cat.getColor() == "grey")) {
//do stuff
}
괄호의 순서를 확인하십시오.
연산 순서는 필요한 것이 아닙니다. 부울 함수가 포함 된 부울 대수가 필요합니다. Maxterms / minterms, 그레이 코드, Karnaugh 테이블, 다이오드, 트랜지스터, 논리 게이트, 멀티플렉서, 비트 가산기, 플립 플롭 ... 원하는 것은 컴퓨터 또는 가상 머신에 부울 "로직"을 구현하는 것입니다. "작업 순서"를 사용하면 논리 게이트 (OR, if) 나노초 간격의 지연 관리와 같은 물리학에 대해 언급 할 수 있습니다.
참조 URL : https://stackoverflow.com/questions/2263660/in-java-what-are-the-boolean-order-of-operations
'IT story' 카테고리의 다른 글
해시 코드 계산을위한 합리적인 소수는 무엇입니까? (0) | 2020.12.25 |
---|---|
log4net에서 프로그래밍 방식으로 버퍼를 플러시하는 방법이 있습니까? (0) | 2020.12.25 |
Zsh에서 Bash의 Ctrl-U와 동일한 단축키는 무엇입니까? (0) | 2020.12.25 |
한 줄에 여러 검색 및 바꾸기 (0) | 2020.12.25 |
weak_ptr은 어떻게 작동합니까? (0) | 2020.12.25 |