2008-11-13 2 views
8

나는 그것이 내가 사용하는 날씨 상관이야 두 변수가 아닌 두 개의 메서드 호출을하고 평가하는 경우 "& &"또는하지 않는 시간이 있습니까 "&"&& (AndAlso)를 통해 문제 및 (그리고)

//some logic that sets bool values 

boolean X = true; 
boolean Y = true; 

if (X & Y){ 
    // perform some operation 
} 

if (X && Y){ 
    // perform some operation 
} 

C# 3.0/.NET 3.5에 사용중인 추가 설명서는 & & 연산자에 대한 참조 만 만들고 & 연산자가 사라지고 있습니까?

답변

3

관찰 된 바와 같이, &은 비트 AND 연산자입니다. 원시 바이너리 수학은 시간이 지남에 따라 점점 줄어들고 있으며, 비트 연산을 이해하지 못하는 개발자가 늘어나고 있습니다. 때때로 고통 스러울 수 있습니다.

그러나 이러한 문제로 가장 잘 해결되는 작업, 특히 데이터를 플래그로 보는 작업이 많이 있습니다. & 연산자는 100 % 필요하며 어디에도 가지 않습니다. 부울 단락 형 && 연산자처럼 자주 사용되지는 않습니다. 예를 들어

:

[Flags] 
enum SomeEnum { // formatted for space... 
    None = 0, Foo = 1, Bar = 2 // 4, 8, 16, 32, ... 
} 
static void Main() { 
    SomeEnum value = GetFlags(); 
    bool hasFoo = (value & SomeEnum.Foo) != 0; 
} 
static SomeEnum GetFlags() { ... } 
9

참/거짓 논리 테스트를 수행하는 경우 항상 & &을 사용하십시오. 단일 &은 비트 단위 'and'를 수행합니다. 어떤 경우에는 로직 테스트와 같은 작업을하지만 모든 로직 케이스에서 작동하는 것은 보장되지 않습니다. &을 가장 많이 사용하는 것은 비트 마스크를 적용 할 때입니다.

예 (& &)

true && true == true 

예 (&는) & &는 AND 연산자 동안

00101001 & 00100001 = 00100001 
1

&는 비트 연산자이다. 두 가지 완전히 다른 작업.

int a = 1; 
int b = 2; 
assert (a & b == 0) 
assert (a && b == true) 

편집 : Ooops ...이 예제는 C#에서 작동하지 않습니다. 그것은 C++에서해야합니다. 바라기를 두 의도 사이의 차이점을 보여줍니다.

+0

C#에서 의도 한대로 단일 및 수행 작업. –

+0

나는 그것을 시도하고 컴파일러가 불평했다 : 연산자 '&'는 'int'와 'bool'타입의 피연산자에 적용될 수 없다. – jpoh

+0

int가 8 비트 값이 아니기 때문에 연산자 '&'를 사용할 수 없다. 바이트를 int로 변환하여 작동하도록해야합니다. – FlySwat

7

단일 & (및)을 사용하면 식의 두 번째 부분이 평가됩니다. 두 번째 부분이 첫 번째 부분이 맞으면이 작업이 잘못 될 수 있습니다. 일반적으로 항상 & &을 사용하십시오. 첫 번째 부분이 거짓이면 두 번째 부분이 평가되지 않습니다.

논리적으로 단일 &은 다른 연산자와 마찬가지로 비트 연산을 수행하지만 부울 비교/평가에 여전히 유효합니다. 실제로 & (또는 |)을 사용해야하는 유일한 시간 (또는 부울 평가)은 두 번째 평가가 항상 실행되어야하는 경우입니다 (함수 호출/수정자인 경우). 이것을 통해 나쁜 습관과 아마 왜 책은 그것을 언급하지 않습니다.

단일 &은 플래그 열거 형 및 비트 마스크와 함께 유용합니다.

bool b = obj != null & obj.IsActive 

하지만이 작동합니다 :

다음은 OBJ의 예외가 발생합니다가 null

bool b = obj != null && obj.IsActive 

이것은 나쁜 :

bool b = obj.IsActive && obj.SetActive(false); 
bool b = obj.IsActive & obj.SetActive(false); 

& 운영자는 여기 있어.