의 차이점은 무엇입니까 | 그리고 || 또는 연산자?


300

나는 항상 ||C #과 PHP 모두에서 OR 표현식에 두 개의 파이프를 사용했습니다 . 때로는 단일 파이프가 사용되는 것을 볼 수 |있습니다. 이 두 사용법의 차이점은 무엇입니까? 하나를 다른 것보다 사용할 때주의해야합니까?

답변:


488

그냥 같은 &&&운영자, 이중 운영자는 "단락"연산자입니다.

예를 들면 다음과 같습니다.

if(condition1 || condition2 || condition3)

condition1이 true이면 조건 ​​2와 3을 확인하지 않습니다.

if(condition1 | condition2 | condition3)

1이 이미 참인 경우에도 조건 2와 3을 점검합니다. 조건이 상당히 비싼 기능 일 수 있으므로이를 사용하여 성능을 향상시킬 수 있습니다.

하나의 큰 경고, NullReferences 또는 이와 유사한 문제가 있습니다. 예를 들면 다음과 같습니다.

if(class != null && class.someVar < 20)

class가 null 인 경우 if 문 class != null은 false입니다. & 만 사용하면 확인하려고 시도 class.someVar하고 멋지게 얻습니다 NullReferenceException. Or-Operator를 사용하면 나쁜 일이 발생할 가능성이 적지 만 염두에 두어야 할 부분이 많지 않을 수 있습니다.

아무도 단일 사용하지 않습니다 &또는 |각 조건을 실행하는 함수 인 디자인을 가지고하지 않는 한,하지만 연산자. 디자인 냄새처럼 들리지만 때로는 (드물게) 일을하는 깨끗한 방법입니다. &운영자는 "이 3 개 기능을 실행하고, 그 중 하나가 false를 반환하는 경우 다른 블록을 실행"를가하면서, 않습니다 |"없음 반환 거짓이있는 경우에만 다른 블록을 실행"않습니다 - 유용하지만 말했듯이, 자주는 디자인이다 냄새.

그러나 두 번째로 |and &연산자를 사용합니다 : Bitwise Operations .


9
예, 콘솔 앱을 만들 때까지 믿지 않았습니다. 그러나 좋은 주인! 그들은 왜 당신에게 밧줄을 줄 것입니까! 나는 OrElse와 AndAlso 키워드 인 VB.NET에 대해 싫어했습니다!
Jarrod Dixon

24
사용에 사람들이 교육 &|조건 연산자로하는 해킹, 그리고 그들도 C / C ++를 사용할 필요가있는 경우 문제를 얻을 것이다 : 1 && 2진정한 동안은 1 & 2false입니다.
BlueRaja-대니 Pflughoeft

47
이것은 해킹이 아니며 7.10.3 부울 논리 연산자의 C #에 대해 공식적으로 지정되어 있습니다. "x 또는 y가 true이면 x | y의 결과는 true입니다. 그렇지 않으면 결과는 false입니다." 7.11 절 조건부 논리 연산자를 참조하십시오. "x || y 작업은 x가 false 인 경우에만 y가 평가된다는 점을 제외하고 x x y 작업에 해당합니다." 더 "합법화"| 조건부 연산자로. 그리고 C / C ++를 사용하는 사람들은 똑같이 작동한다고 맹목적으로 가정하면 어려울 것입니다. 말했듯이 : 사용 | if 문에서 디자인 냄새이지만 완벽하게 합법적 인 작업입니다.
Michael Stum

9
나는 그것이 인 해킹 그냥, 법적 아니라고 말했다 결코 (당신이 사용하고 &보다 의미 다른를 전달하기 위해 무엇을 거의 항상 수단 : 비트 단위 등) .
BlueRaja-대니 Pflughoeft

15
@ BlueRaja-DannyPflughoeft 문서화 된 기능을 사용하기위한 문서라고 할 때 해킹 된 문서를 호출하는 것은 스위치 구문 "anotherif hack"을 사용하는 것과 같습니다. 도구 상자의 도구로, 거의 사용되지 않는 특수 도구 일 수 있지만 덜 중요합니다.
Gent

80

|| 논리 OR 연산자입니다. 기본적으로 그것이 무엇인지 아는 것 같습니다. if, while 등과 같은 조건문에 사용됩니다.

condition1 || condition2

condition1 또는 condition2 중 하나가 true이면 true로 평가됩니다.

| 비트 OR 연산자입니다. 두 개의 숫자로 작동하는 데 사용됩니다. 각 숫자의 각 비트를 개별적으로보고 비트 중 하나가 하나 이상의 숫자에서 1이면 결과 비트도 1이됩니다. 다음은 몇 가지 예입니다.

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

잘만되면 그것은 의미가 있습니다.

마지막 두 가지 질문에 답하기 위해 "두 연산자의 차이점을 아는 것"외에는 경고가 없습니다. 그들은 완전히 다른 두 가지 일을하기 때문에 서로 교환 할 수 없습니다.


이를 통해 누군가 누군가가 OR 연산을 사용하여 Mongodb C # 드라이버에서 필터를 병합하는 방법을 이해할 수있었습니다. gist.github.com/a3dho3yn/…
Donny V.

30

하나는 "비트 단위"입니다.

10011b | 01000b => 11011b

다른 하나는 논리입니다.

참 또는 거짓 => 참


2
|bool단락없이 유형에 사용할 수 있습니다 .
juharr

14

좋은 질문. 이 두 연산자는 PHP와 C #에서 동일하게 작동합니다.

|비트 OR입니다. 비트별로 두 값을 비교합니다. 예 : 1101 | 0010 = 1111. 비트 옵션을 사용할 때 매우 유용합니다. 예를 들어 Read = 01 (0X01) Write = 10 (0X02) Read-Write = 11 (0X03)입니다. 유용한 예가 파일을 여는 것입니다. 간단한 예는 다음과 같습니다.

File.Open(FileAccess.Read | FileAccess.Write);  //Gives read/write access to the file

||논리 OR입니다. 이것은 대부분의 사람들이 OR을 생각하는 방식이며 그들의 진실에 따라 두 가지 가치를 비교합니다. 예를 들어 나는 가게에 가거나 쇼핑몰에 갈 것입니다. 이것은 코드에서 가장 자주 사용되는 것입니다. 예를 들면 다음과 같습니다.

if(Name == "Admin" || Name == "Developer") { //allow access } //checks if name equals Admin OR Name equals Developer

PHP 리소스 : http://us3.php.net/language.operators.bitwise

C # 리소스 : http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx


4
기술적으로 C #의 FWIW |논리적이거나 부울에 적용될 때 입니다. 연결된 참조 상태입니다. 그것은 비트 연산자 것처럼 비트 값 때문에 실제로, 최종 결과는 동일 true하고 false는 비트 또는 값으로 논리적으로 동일한 결과를 생성하거나 않도록한다. 즉 (int)(bool1 | bool2)== ((int)bool1) | ((int)bool2)입니다.
ToolmakerSteve

4

자바의 간단한 예

public class Driver {

  static int x;
  static int y;

public static void main(String[] args) 
throws Exception {

System.out.println("using double pipe");
    if(setX() || setY())
        {System.out.println("x = "+x);
        System.out.println("y = "+y);
        }



System.out.println("using single pipe");
if(setX() | setY())
    {System.out.println("x = "+x);
    System.out.println("y = "+y);
    }

}

 static boolean setX(){
      x=5;
     return true;
  }
 static boolean setY(){
      y=5;
      return true;
  }
}

출력 :

using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5

2
왜 java를 언급하지 않은 질문에 대한 Java 예제를 제공합니까?
juharr

4

&-(조건 1 및 조건 2) : 첫 번째가 거짓 인 경우에도 두 경우를 모두 확인합니다.

&&-(조건 1 및 조건 2) : 사례 1이 거짓 인 경우 두 번째 사례를 확인하지 않아도됩니다.

&&-연산자는 코드를보다 빠르고 전문적으로 실행하며 거의 사용하지 않습니다.

| -(조건 1 | 조건 2) : 사례 1이 참인 경우에도 두 경우를 모두 확인합니다.

|| -(조건 1 || 조건 2) : 첫 번째 사례가 참인 경우 두 번째 사례를 확인하지 않아도됩니다.

|| -운영자가 전문적으로 코드를 더 빠르게 실행합니다 | 거의 사용되지 않습니다


2
rarely used? 모두 당신이 원하거나해야 할 일에 달려 있습니다.
Emaborsa 12

1
큰! 짧고 달콤한 "Emaborsa가 말했듯이 실제로는 당신이 원하거나해야 할 일에 달려 있기 때문에"|는 거의 사용되지 않습니다 "와"&는 거의 사용되지 않습니다 "를 제거합니다.
Iannick

0

단일 파이프 |는 비트 연산자 중 하나입니다 .

Wikipedia에서 :

C 프로그래밍 언어 패밀리에서 비트 OR 연산자는 "|"입니다. (파이프). 이 연산자는 피연산자를 부울 값으로 처리하고 "||"로 작성된 부울 "논리적"또는 "부"와 혼동해서는 안됩니다. (2 개의 파이프).


0

수학적 정의에 따르면 OR과 AND는 이항 연산자입니다. 그들은 다음과 유사하게 LHS 및 RHS 조건을 검증합니다. | 그리고 &.

|| L & S 조건이 충족되지 않으면 OR 및 AND 연산자의 특성을 중지하여 && 변경하십시오.


-1

| 연산자는 두 개의 피연산자에 대해 비트 단위 OR을 수행합니다 (즉, 양쪽이 false를 반환하려면 false로 평가되어야 함을 의미 함). 필요한 경우 두 번째 연산자 만 평가합니다.

http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx


이 기사를 실제로 읽으면 비트 연산자를 참조하고 있음을 알 수 있습니다
johnc

그것은 비트 단위의 의미가 아닙니다.
juharr

-1

단일 파이프 "|" "비트 단위"이거나 수행중인 작업을 알고있는 경우에만 사용해야합니다. 이중 파이프 "||" 논리 또는 "x == 0 || x == 1"과 같은 논리 문에서 사용할 수 있습니다.

다음은 비트 단위 또는 수행 단위의 예입니다. a = 0101 및 b = 0011이면 a | b = 0111입니다. 0이 아닌 값을 true로 처리하는 논리 시스템을 다루는 경우 비트 단위 또는 논리 또는 논리와 같은 방식으로 작동하지만 비트 단위 및 "&"는 해당되지 않습니다. 또한 비트 단위 또는 단락 평가를 수행하지 않습니다.


'|' bool단락없이 유형 에 사용할 수도 있습니다 .
juharr

-2

단일 파이프 (|)는 비트 OR 연산자 입니다.

두 개의 파이프 (||)는 논리 OR 연산자입니다.

그들은 서로 바꿔 쓸 수 없습니다.


1
비트 단위 연산을 무시하면 이중 파이프는 게으른 평가이고 단일 파이프는 논리 연산자 영역 내에서 욕심입니다.
Alex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.