2008-08-29 3 views
231

저는 항상 C#과 PHP 모두에서 OR 표현식에 || (두 개의 파이프)을 사용했습니다. 때로는 하나의 파이프가 사용되는 것을 볼 수 있습니다 : |. 두 가지 용도의 차이점은 무엇입니까? 하나를 다른 것 위에 사용하거나 교환 할 때주의 사항이 있습니까?| 및 || 또는 통신 수?

답변

380

double 연산자는 &&& 연산자와 마찬가지로 "단락 회로"연산자입니다. 예를 들어

:

if(condition1 || condition2 || condition3) 

조건 1에 해당하는 경우는, 조건 2와 3은 확인되지 않습니다.

if(condition1 | condition2 | condition3) 

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

하나의 큰 경고, Null 참조 또는 유사한 문제가 있습니다. 예를 들어 클래스가 null

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

경우 class != null가 false 후 경우 문이 중지됩니다. & 만 사용하는 경우 class.someVar을 확인하면 좋은 NullReferenceException이 표시됩니다. Or-Operator를 사용하면 그다지 함정에 빠지기는 힘들지 만, 나쁜 것을 유발할 가능성은 거의 없지만 염두에 두어야 할 사항입니다.

각 조건이 실행될 기능 인 설계가없는 한 누구도 & 또는 | 연산자를 사용하지 않습니다. 디자인 냄새가 나는 것처럼 들리지만 때로는 (드물게) 물건을 만드는 청결한 방법입니다. & 연산자는 "이 3 개의 함수를 실행하고 그 중 하나가 false를 반환하면 else 블록을 실행"하고 |은 "false를 반환하지 않으면 else 블록 만 실행합니다"- 유용 할 수 있지만 종종 그렇습니다 디자인 냄새.

|& 연산자를 두 번째로 사용합니다 (Bitwise Operations).

+42

이것이 왜 downvoted가되는지 확실하지 않습니다 - 정확합니다! 만약 당신이 그를 믿지 않는다면 컴파일러에서 두 번 확인하십시오! –

+8

그래, 내가 콘솔 앱을 만들 때까지 나는 그것을 믿지 않았다. 그러나 좋은 주인! 왜 그들은 너에게 줄을 줄 것이냐! 나는 VB.NET에 대해 그것을 싫어했다 - OrElse와 AndAlso 키워드! –

+1

이러한 명령의 단락 회로 특성을 좋아합니다! 첫 번째 검사가 성공하면 두 번째 검사를 실행하기 위해 항상이 객체를 사용합니다. null 객체 검사는 다음과 같습니다. if (myObj! = null && myObj.resultCode == 0) Console.WriteLine ("Yay!") ; – joshperry

26

하나는 "비트 또는"입니다.

10011b | 01000b => 11011b

다른 하나는 논리 또는입니다.

true 또는 false => true

0

| 연산자는 두 피연산자의 비트 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

+0

실제로 비트 시트 연산자를 참조하는 경우 비트 연산자를 참조하는 것으로 나타났습니다 – johnc

0

그을음 파이프 "|" "bitwise"또는 또는 당신이하는 일을 알고있을 때만 사용해야합니다. 이중 파이프 "||" 또는 "x == 0 || x == 1"과 같은 논리적 명령문에 사용할 수 있습니다.

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

-1

단일 파이프 (|)는 bitwise OR operator입니다.

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

이들은 서로 바꿀 수 없습니다.

+0

비트 연산을 무시하면 논리적 연산자 영역 내에서 이중 파이프가 지연 평가되고 단일 파이프가 욕심입니다. – Alex

-1

|| (두 개의 파이프)는 일반적으로 논리적 인이거나 | (하나의 파이프)는 이진 또는입니다. 내 머리 꼭대기에서, 나는 그 차이가 커다란 문제가 될 때를 생각할 수 없다. (결과를 다른 것에 할당 할 때를 제외하고). 그러나 나는 다른 누군가가 그것이 중요한 상황을 확신 할 것이다.

편집 : 와우, 여섯 개의 다른 답변은이 글을 쓰는데 걸렸습니다.

66

|| 논리 OR 연산자입니다. 당신이 기본적으로 그게 뭔지 알 것 같습니다. if, while 등과 같은 조건문에 사용됩니다.

condition1 || condition2 

조건 1 또는 조건 2가 참이면 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 

희망적으로 생각합니다.

마지막 두 가지 질문에 대답하려면 "두 운영자의 차이점을 알아야합니다."외에 다른 경고가 없다고 말하지 않을 것입니다. 그들은 완전히 다른 두 가지 일을하기 때문에 서로 교환 할 수 없습니다.

10

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

| 비트 OR입니다. 두 값을 비트로 비교합니다. 예 : 1101 | 0010 = 1111. 이것은 비트 옵션을 사용할 때 매우 유용합니다. 예 : 읽기 = 01 (0X01) 쓰기 = 10 (0X02) 읽기 - 쓰기 = 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

+0

FWIW, 기술적으로 C#에서'| '는 ** 논리 값이거나 ** booleans에 적용될 때 ** **. 연결된 참조 상태. 실제적으로 최종 결과는 비트 연산자 인 경우와 동일합니다. 'true'와 'false'의 비트 값은 비트 또는 비트 값이 논리 값과 똑같은 결과를 생성하기 때문입니다. 그것은'(int) (bool1 | bool2)'=='((int bool1) | ((정수) bool2)'. – ToolmakerSteve

1

단일 파이프, |는 bitwise 사업자 중 하나입니다.

위키

:

C 프로그래밍 언어 가족에서

, 비트 OR 연산자는 "|" (파이프). 다시,이 연산자는 피연산자를 부울 값으로 취급하는 부울 "논리"또는 "대응"과 혼동되어서는 안되며 "||" (두 개의 파이프).

-1

비트 단위 (|) 대 논리적 (||)! 비트 연산자가 이러한 객체를 보면서 시각적으로 쌍둥이인지 (논리적으로와 같이) 보는 대신에 구별 할 수있는 "부분"을 비교하면서 논리를 Java의 Comparable 객체로 생각하고 DNA 샘플을 실행하여 0과 1 대신에. 자바

3

간단한 예를

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 
0

, OR 및 AND 이항 연산자이다; 이들은 LHS 조건과 RHS 조건을 | 및 &.

|| & &은 LHS 조건이 충족되지 않을 때 OR 연산자와 AND 연산자를 중지하여 속성을 변경합니다.

1

& - (조건 1 개 & 조건 2) : 제 하나가 거짓 인 경우에도 검사 두 경우를

& & - (1- & & 상태 2 상태)가 정상적이 경우 하나의 경우에 두 번째 경우를 확인하는 신경 은 false입니다

& & - 운영자는 전문적으로 &는 거의 사용되지 않습니다, 빠른 코드 실행을 할 것입니다

| - (조건 1 | 조건 2) : 사례 1이 참이더라도 두 경우를 모두 확인하십시오.

|| - (조건 1 || 조건 2) : 첫번째 경우 중 하나가 참이면 두 번째 경우를 확인하기가 어렵습니다.

|| - 운영자가 코드를 더 빨리, 전문적으로 실행하게합니다. 거의 사용되지 않음