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


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.