보통 | over | 를 사용하는 이유는 무엇입니까?뭐가 다른데?
OR을 입니다.||
가 아닌 OR간|
둘 다 잘 되고 있지만요.
제 말은, 다음을 보세요.
if(true | true) // pass
if(true | false) // pass
if(false | true) // pass
if(false | false) // no pass
if(true || true) // pass
if(true || false) // pass
if(false || true) // pass
if(false || false) // no pass
''는 쓸 수 요?|
||
거랑 같은 랑 같은 거랑 같은 거랑&
★★★★★★★★★★★★★★★★★」&&
.
「 」를하고 있는 는,||
★★★★★★★★★★★★★★★★★」&&
이 을 참조해당 폼은|
★★★★★★★★★★★★★★★★★」&
Java는 이러한 연산자의 형식을 사용하여 우측 연산자만을 평가하지 않습니다.
대부분의 경우 평가를 단축할 것인가의 문제입니다.
단락의 이점을 설명하는 좋은 방법은 다음 예를 검토하는 것입니다.
Boolean b = true;
if(b || foo.timeConsumingCall())
{
//we entered without calling timeConsumingCall()
}
Jeremy와 Peter가 언급한 바와 같이 단락에 대한 또 다른 이점은 null 참조 점검입니다.
if(string != null && string.isEmpty())
{
//we check for string being null before calling isEmpty()
}
|
는 부울식으로 단락 평가를 하지 않습니다. ||
는 첫 참일 합니다.단, 이 피연산자가 참일 경우 평가를 정지합니다.|
할 거예요.
외에 '있다'도 있어요.|
는 바이트/쇼트/인트/롱 값에 대한 비트 단위 OR 연산을 수행하는 데 사용할 수 있습니다. ||
하다.
따라서 예를 들어 다른 답변을 바탕으로 하기 위해서는 다음과 같은 방어 체크에서 단락이 중요합니다.
if (foo == null || foo.isClosed()) {
return;
}
if (bar != null && bar.isBlue()) {
foo.doSomething();
}
「」를 사용합니다.|
★★★★★★★★★★★★★★★★★」&
여기에 던져질 수도 있습니다.
★★||
★★★★★★★★★★★★★★★★★」&&
필요한 경우에만 우측을 점검한다.|
★★★★★★★★★★★★★★★★★」&
항상 양쪽을 체크합니다.
예를 들어 다음과 같습니다.
int i = 12;
if (i == 10 & i < 9) // It will check if i == 10 and if i < 9
...
다시 쓰기:
int i = 12;
if (i == 10 && i < 9) // It will check if i == 10 and stop checking afterward because i != 10
...
또 다른 예는 다음과 같습니다.
int i = 12;
if (i == 12 | i > 10) // It will check if i == 12 and it will check if i > 10
...
다시 쓰기:
int i = 12;
if (i == 12 || i > 10) // It will check if i == 12, it does, so it stops checking and executes what is in the if statement
...
또, 일반적인 함정에 주의해 주세요.게으르지 않은 연산자는 게으른 연산자보다 우선합니다.따라서 다음과 같습니다.
boolean a, b, c;
a || b && c; //resolves to a || (b && c)
a | b && c; //resolves to (a | b) && c
섞을 때는 조심하세요.
단락과 더불어 주의해야 할 또 다른 점은 0 또는1 이외의 값으로 비트 논리 연산을 실행하는 것은 조건부 논리와는 매우 다른 의미를 갖는다는 것입니다.는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★,|
★★★★★★★★★★★★★★★★★」||
, 를 사용하여, 를 참조해 주세요.&
★★★★★★★★★★★★★★★★★」&&
수 있습니다( 른른른른른른른른른른른른((((((((((((((:2 & 4
인 반면 0/false는 ""입니다.2 && 4
1/true).
함수에서 얻을 수 있는 것이 실제로는 에러 코드이며, 0이 아닌 것을 테스트하고 있는 경우, 이것은 매우 중요합니다.
이것은 Java에서는 부울에 명시적으로 타이프 캐스트를 하거나 0과 같은 것을 비교할 필요가 있는 만큼 문제가 되지 않지만, 유사한 구문(C/C++ 등)을 가진 다른 언어에서는 상당히 혼란스러울 수 있습니다.
또한 & 및 |는 정수형 값에만 적용할 수 있으며 부울 테스트에 해당하는 모든 값은 아닙니다.자바어 할 수 이 꽤 .!= 0
(', '', '', '')operator bool()
및
「 」를 사용하는 은, 「 」입니다.|
★★★★★★★★★★★★★★★★★」&
||
★★★★★★★★★★★★★★★★★」&&
는 매우 단순한 부울식이 있으며, 숏컷(브런치) 비용이 나중에 식을 평가하지 않음으로써 절약되는 시간보다 큰 경우입니다.
그러나 이것은 가장 낮은 수준의 코드를 제외하고는 거의 문제가 되지 않는 미세 최적화이다.
||는 논리 또는 연산자이고 |는 비트 또는 연산자입니다.
boolean a = true;
boolean b = false;
if (a || b) {
}
int a = 0x0001;
a = a | 0x0002;
a | b: 어떤 경우에도 b를 평가한다.
a || b: a가 false로 평가되는 경우에만 b를 평가합니다.
또한 |가 비트 연산자: ||는 단락 연산자이며, 한쪽 요소가 false일 경우 다른 요소는 체크되지 않습니다.
if(something || someotherthing)
if(something | someotherthing)
어떤 것이 참일 경우 ||는 다른 것을 평가하지 않지만 |는 평가합니다.if-statement의 변수가 실제로 함수 호출인 경우 ||을 사용하면 성능이 대폭 절감될 수 있습니다.
| is the binary or operator
|| is the logic or operator
" "||
★★★★★★★★★★★★★★★★★」&&
를 조건부 연산자라고 부릅니다.|
★★★★★★★★★★★★★★★★★」&
비트 연산자라고 불립니다.그들은 다른 목적을 가지고 있다.
되는 식에 합니다.boolean
왼쪽과 오른쪽 양쪽에 있습니다.
비트 연산자는 모든 숫자 오퍼랜드와 함께 작동합니다.
논리적 비교를 수행할 경우 조건부 연산자를 사용해야 합니다. 코드에는 일종의 유형 안전성이 추가되기 때문입니다.
참고: Java에는 |=가 있지만 |=는 없습니다.
||를 사용해야 하는 예로는 첫 번째 식이 두 번째 식이 폭발하는지 여부를 테스트하는 경우를 들 수 있습니다.예를 들어, 다음의 경우 단일 |를 사용하면 NPE가 발생할 수 있습니다.
public static boolean isNotSet(String text) {
return text == null || text.length() == 0;
}
다른 답변은 연산자 간의 기능적 차이를 잘 다루었지만, 그 답변은 오늘날 존재하는 거의 모든 C 유래 언어에 적용될 수 있다.질문에는 java 태그가 붙어 있기 때문에 자바 언어에 대해 구체적이고 기술적으로 답변할 수 있도록 노력하겠습니다.
&
★★★★★★★★★★★★★★★★★」|
정수 비트 연산자 또는 부울 논리 연산자 중 하나입니다.비트 연산자 및 논리 연산자('15.22)의 구문은 다음과 같습니다.
AndExpression:
EqualityExpression
AndExpression & EqualityExpression
ExclusiveOrExpression:
AndExpression
ExclusiveOrExpression ^ AndExpression
InclusiveOrExpression:
ExclusiveOrExpression
InclusiveOrExpression | ExclusiveOrExpression
의 . " " "EqualityExpression
§ 15.21에 정의되어 있습니다.이거는RelationalExpression
§ 15.20에 정의되어 있습니다.이것에 의해, 필요한 것은, 다음과 같습니다.ShiftExpression
★★★★★★★★★★★★★★★★★」ReferenceType
§ 15.19 및 § 4.3에서 각각 정의된다. ShiftExpression
에는 「」가 필요합니다.AdditiveExpression
§ 15.18에 정의된 기본 산술, 단항 연산자 등을 정의하며 드릴다운을 계속한다. ReferenceType
(한편,ReferenceType
원시 유형을 포함하지 않습니다.기본 유형의 정의는 최종적으로 필요합니다.이는 배열의 차원 유형일 수 있기 때문입니다.ReferenceType
비트 연산자 및 논리 연산자에는 다음 속성이 있습니다.
- 는 우선순위가 , 순위는 다르다.
&
순위와 "우선 순위"를 경우|
최저 우선 순위- 이러한 연산자는 각각 구문적으로 왼쪽과 관련이 있습니다(각 그룹별로 왼쪽에서 오른쪽으로).
- 피연산자 표현식에 부작용이 없는 경우 각 연산자는 가환됩니다.
- 각 연산자는 연관성이 있습니다.
- 또는 할 수 .
boolean
기타 모든 경우 컴파일 시간 오류가 발생합니다.
연산자가 비트 연산자인지 논리 연산자인지의 구별은 피연산자가 "원시 적분 유형으로 변환 가능"(44.2)인지 또는 피연산자가 유형인지에 따라 달라진다.boolean
★★★★★★★★★★★★★★★★★」Boolean
(제5.1.8절).
피연산자가 정수형인 경우 양쪽 피연산자에 대해 바이너리 수치 승격(65.6.2)이 실행되어 양쪽 피연산자가 둘 중 하나로 남습니다.long
""int
「」. 은, (오퍼랜드의.작업의 유형은 (승격된) 오퍼랜드의 유형이 됩니다. 「 」는 「 」를 참조해 주세요.&
비 and AND will will 、 가 AND 。^
비트 배타적 OR이 됩니다.|
비트 포함 OR이 됩니다.(1515.22.1)
가 ''인 boolean
★★★★★★★★★★★★★★★★★」Boolean
, 오퍼랜드는 필요에 따라서 언박스 변환이 됩니다(제5.1.8항).동작의 타입은 다음과 같습니다.boolean
&
「」가 .true
가 '''일 ''true
,^
「」가 .true
, 및 (양쪽 오퍼랜드가 다른 경우)|
「」가 .true
가 「」인 .true
. (제15.22.2절)
그에 반해서, &&
'조건부 연산자'(2315.23)와||
'조건부 연산자'(1515.24)입니다.구문은 다음과 같이 정의됩니다.
ConditionalAndExpression:
InclusiveOrExpression
ConditionalAndExpression && InclusiveOrExpression
ConditionalOrExpression:
ConditionalAndExpression
ConditionalOrExpression || ConditionalAndExpression
&&
~와 &
왼쪽 가 「」인 , 오른쪽 합니다.true
||
~와 |
왼쪽 가 「」인 , 오른쪽 합니다.false
.
Conditional-And에는 다음 속성이 있습니다.
- 조건부 연산자와 연산자는 구문적으로 왼쪽과 관련이 있습니다(왼쪽에서 오른쪽으로 그룹화).
- 조건부 연산자는 부작용과 결과 값 모두에 대해 완전히 연관성이 있습니다., 「」입니다.
a
,b
, , , , 입니다.c
, 「」((a) && (b)) && (c)
같은은, 와 같습니다.(a) && ((b) && (c))
.- 및 각는 유형으로 .
boolean
★★★★★★★★★★★★★★★★★」Boolean
또는 컴파일 시간 오류가 발생합니다.- 은 항상 ""입니다.
boolean
.- 에는 먼저됩니다.에 타입이 있는 에는 타입이 「」으로 되어 있습니다. 결과에 유형이 있는 경우
Boolean
unboxing 변환(제5.1.8항)이 이루어집니다.- 이 "Drughta"인
false
은 조조음 , , , , , , 。false
우측 오퍼랜드식은 평가되지 않습니다.- 이 쪽쪽 、 음음 、 음음 、 음음 、 음 if if if if if if if if if if if if if if if if if
true
그이 '아예'일 경우에는 '아예.결과에 유형이 있는 경우Boolean
unboxing 변환(제5.1.8항)이 이루어집니다.결과 값은 조건식과 식 값이 됩니다.- thus따는
&&
&
boolean
'항상이 다릅니다.이는 오른쪽 피연산자 식이 항상이 아닌 조건부로 평가된다는 점에서만 다릅니다.
Conditional-Or에는 다음 속성이 있습니다.
- 조건부 또는 연산자는 구문적으로 왼쪽 관련지어집니다(왼쪽에서 오른쪽으로 그룹화됩니다).
- 조건 연산자는 부작용과 결과 값과 완전히 연관된다., 「」입니다.
a
,b
, , , , 입니다.c
, 「」((a) || (b)) || (c)
같은은, 와 같습니다.(a) || ((b) || (c))
.- 각는 유형으로 .
boolean
★★★★★★★★★★★★★★★★★」Boolean
또는 컴파일 시간 오류가 발생합니다.- 조건식의 유형은 항상 다음과 같습니다.
boolean
.- 에는 먼저됩니다.에 타입이 있는 에는 타입이 「」으로 되어 있습니다. 결과에 유형이 있는 경우
Boolean
unboxing 변환(제5.1.8항)이 이루어집니다.- 이 "Drughta"인
true
은 조건식 또는true
우측 오퍼랜드식은 평가되지 않습니다.- 이 쪽쪽 、 음음 、 음음 、 음음 、 음 if if if if if if if if if if if if if if if if if
false
그이 '아예'일 경우에는 '아예.결과에 유형이 있는 경우Boolean
unboxing 변환(제5.1.8항)이 이루어집니다.결과 값은 조건식 또는 식 값이 됩니다.- thus따는
||
|
boolean
★★★★★★★★★★★★★★★★★」Boolean
'항상이 다릅니다.이는 오른쪽 피연산자 식이 항상이 아닌 조건부로 평가된다는 점에서만 다릅니다.
요컨대 @JohnMeagher가 댓글에서 여러 번 지적했듯이&
그리고.|
실제로는 피연산자가 다음 중 하나일 경우 짧은 지연을 수반하지 않는 부울 연산자입니다.boolean
또는Boolean
베스트 프랙티스(즉, 2차 효과 없음)에서는, 이것은 작은 차이입니다.피연산자가 피연산자가boolean
또는Boolean
그러나 연산자의 동작은 매우 다릅니다.즉, 비트 연산과 논리 연산은 Java 프로그래밍의 높은 수준에서는 잘 비교되지 않습니다.
1) (expression1 | expression2) | 연산자는 expression1의 결과가 참인지 거짓인지에 관계없이 expression2를 평가합니다.
예:
class Or
{
public static void main(String[] args)
{
boolean b=true;
if (b | test());
}
static boolean test()
{
System.out.println("No short circuit!");
return false;
}
}
2) (expression1 || expression2), expression1이 참일 경우 || 연산자는 expression2를 평가하지 않습니다.
예:
class Or
{
public static void main(String[] args)
{
boolean b=true;
if (b || test())
{
System.out.println("short circuit!");
}
}
static boolean test()
{
System.out.println("No short circuit!");
return false;
}
}
|| 2개의 값을 OR하여 부울값을 반환합니다(이것이 논리 또는 로지컬로 알려진 이유).
IE:
if (A || B)
A 또는 B가 true이면 true를 반환하고 둘 다 false이면 false를 반환합니다.
|는 2개의 값에 대해 비트 연산을 실행하는 연산자입니다.비트 연산을 더 잘 이해하려면 다음 문서를 참조하십시오.
http://en.wikipedia.org/wiki/Bitwise_operation
1가지 주요 차이점은 |와 &&가 "쇼트 서킷"을 표시하기 때문에 RHS는 필요한 경우에만 평가됩니다.
예를 들어,
if (a || b) {
path1...
} else {
path2..
}
위의 a가 참일 경우 b는 테스트되지 않고 path1이 실행됩니다.|를 사용하면 'a'가 참일 경우에도 양쪽이 평가됩니다.
이게 도움이 됐으면 좋겠다.
단락되지 않는 것이 도움이 될 수 있습니다.때로는 두 식이 평가되는지 확인해야 합니다.예를 들어, 두 개의 개별 목록에서 개체를 제거하는 방법이 있다고 가정합니다.다음과 같은 작업을 수행할 수 있습니다.
class foo {
ArrayList<Bar> list1 = new ArrayList<Bar>();
ArrayList<Bar> list2 = new ArrayList<Bar>();
//Returns true if bar is removed from both lists, otherwise false.
boolean removeBar(Bar bar) {
return (list1.remove(bar) & list2.remove(bar));
}
}
메서드가 대신 조건부 오퍼랜드를 사용한 경우 첫 번째 목록이 false를 반환하면 두 번째 목록에서 개체를 제거할 수 없습니다.
//Fails to execute the second remove if the first returns false.
boolean removeBar(Bar bar) {
return (list1.remove(bar) && list2.remove(bar));
}
이 기능은 놀라울 정도로 유용하지 않으며 (대부분의 프로그래밍 태스크와 마찬가지로) 다른 방법으로도 사용할 수 있습니다.그러나 이는 비트 단위 오퍼랜드의 사용 사례입니다.
이들 간의 기본적인 차이점은 |가 먼저 값을 바이너리로 변환한 후 비트 와이즈 또는 연산을 수행한다는 것입니다.한편 ||는 데이터를 바이너리로 변환하지 않고 원래 상태에서 또는 식을 수행합니다.
int two = -2; int four = -4;
result = two | four; // bitwise OR example
System.out.println(Integer.toBinaryString(two));
System.out.println(Integer.toBinaryString(four));
System.out.println(Integer.toBinaryString(result));
Output:
11111111111111111111111111111110
11111111111111111111111111111100
11111111111111111111111111111110
상세내용 : http://javarevisited.blogspot.com/2015/01/difference-between-bitwsie-and-logical.html#ixzz45PCxdQhk
저는 이 질문을 받았을 때 이에 대한 아이디어를 얻기 위해 테스트 코드를 만들었습니다.
public class HelloWorld{
public static boolean bool(){
System.out.println("Bool");
return true;
}
public static void main(String []args){
boolean a = true;
boolean b = false;
if(a||bool())
{
System.out.println("If condition executed");
}
else{
System.out.println("Else condition executed");
}
}
}
이 경우 a 또는 b를 추가하는 조건의 왼쪽 값만 변경합니다.
||
시나리오(왼쪽이 true일 경우 [if(a||bool()])]
산출량"If condition executed"
||
시나리오, 왼쪽 false [if(b||bool()]
출력-
Bool
If condition executed
Conclusion of ||
사용시||
오른쪽은 왼쪽이 거짓일 때만 확인합니다.
|
시나리오(왼쪽이 true인 경우 [if(a|bool()])]
출력-
Bool
If condition executed
|
시나리오, 왼쪽 false [if(b|bool()]
출력-
Bool
If condition executed
Conclusion of |
사용시|
왼쪽과 오른쪽을 모두 확인합니다.
| = 비트 단위 또는 | = 로직 또는
보통 pre increment 연산자와 post increment 연산자가 있을 때 사용합니다.다음 코드를 확인합니다.
package ocjpPractice;
/**
* @author tithik
*
*/
public class Ex1 {
public static void main(String[] args) {
int i=10;
int j=9;
int x=10;
int y=9;
if(i==10 | ++i>j){
System.out.println("it will print in first if");
System.out.println("i is: "+i);
}
if(x==10 ||++x>y){
System.out.println("it will print in second if");
System.out.println("x is: "+x);
}
}
}
출력:
만약 그렇다면 먼저 인쇄될 것이다.
i는: 11
초단위로 인쇄됩니다.
x는: 10
둘다요.if
블록은 같지만 결과가 다릅니다.있을 때|
두 조건을 모두 평가합니다.하지만 만약 그렇다면||
첫 번째 조건이 이미 참이기 때문에 두 번째 조건은 평가되지 않습니다.
많은 사용 사례가 있습니다.이러한 사용 예에서는, 델의 IT부문이||
보다는|
. 일부 사용 사례에서는|
오퍼레이터를 사용하여 모든 조건을 확인합니다.
예를 들어 양식 유효성 검사를 확인하고 사용자에게 첫 번째 잘못된 필드가 아닌 오류 텍스트로 모든 잘못된 필드를 표시하려는 경우.
||
연산자는 다음과 같습니다.
if(checkIfEmpty(nameField) || checkIfEmpty(phoneField) || checkIfEmpty(emailField)) {
// invalid form with one or more empty fields
}
private boolean checkIfEmpty(Widget field) {
if(field.isEmpty()) {
field.setErrorMessage("Should not be empty!");
return true;
}
return false;
}
따라서 위의 스니펫과 함께 사용자가 모든 빈 필드와 함께 폼을 제출하는 경우에만nameField
에러 메시지와 함께 표시됩니다.근데 만약에 이렇게 바꾸면
if(checkIfEmpty(nameField) | checkIfEmpty(phoneField) | checkIfEmpty(emailField)) {
// invalid form with one or more empty fields
}
에러 메세지가 각 필드에 표시됩니다.true
조건들.
주의 깊게 읽어본 결과, 이 항목을 사용하는지 아닌지 아직 잘 모르겠습니다.|
논리연산자는 Java 패턴 프랙티스에 준거하고 있습니다.
최근 풀 요청에서 코멘트를 수신처로 하는 코드를 수정했습니다.
if(function1() | function2()){
...
}
로 바뀌어야 했다
boolean isChanged = function1();
isChanged |= function2();
if (isChanged){
...
}
실제로 허용되는 버전은 무엇입니까?
Java 설명서에서 언급되지 않았습니다.
|
논리적으로 단락되지 않는 OR 연산자로 사용됩니다.
투표에 관심이 없고 기준을 찾는 데 더 관심이 있다.두 코드 버전 모두 컴파일되어 정상적으로 동작하고 있습니다.
||는 논리, |는 비트 단위 또는
|는 비트 단위이거나 ||가 논리적이거나
다음 항목을 참조하십시오.
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/operators.html
| 비트 포함 OR
||는 논리 OR입니다.
|는 비트 연산자입니다.||는 논리 연산자입니다.
하나는 2비트 또는 그 둘 중 하나를 취합니다.
누군가는 진실을 결정할 것이다(이것이 진실인지 저것이 진실인지). 만약 이것이 진실이라면, 답은 진실이다.
오, 그리고 사람들은 이 질문들에 빨리 대답합니다.
언급URL : https://stackoverflow.com/questions/7101992/why-do-we-usually-use-over-what-is-the-difference
'itsource' 카테고리의 다른 글
Vue.js에서 optgroup select 라벨을 설정하는 방법 (0) | 2022.08.14 |
---|---|
구성 요소 방법 재정의 (0) | 2022.08.14 |
단방향 및 양방향 JPA 및 휴지 상태 연결의 차이점은 무엇입니까? (0) | 2022.08.14 |
vs omp simd의 병렬: 각각 언제 사용합니까? (0) | 2022.08.14 |
Vue js의 인스턴스 외부에서 데이터에 액세스하는 방법이중 값을 소수점 2자리로 포맷하는 가장 좋은 방법 (0) | 2022.08.14 |