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

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



답변

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

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

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 .


답변

|| 논리 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

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

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


답변

하나는 “비트 단위”입니다.

10011b | 01000b => 11011b

다른 하나는 논리입니다.

참 또는 거짓 => 참


답변

좋은 질문. 이 두 연산자는 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


답변

자바의 간단한 예

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


답변

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

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

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

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

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

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


답변

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

Wikipedia에서 :

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