2014-07-01 3 views
0

다음 코드를 고려하십시오& = 연산자 등가

bool funcExecuted = false; 
bool result = false; 
Func<bool> returnFalse =() => 
{ 
    funcExecuted = true; 
    return false; 
}; 
result &= returnFalse(); 

string msg = funcExecuted?"Executed":"Not Executed"; 
Console.WriteLine(msg); 

예상 결과 :

  • 내가 Not Executed

실제 결과의 메시지가 예상 :

  • 나는 Executed 메시지를 받았다.

결론 :

result &= returnFalse();result = result & returnFalse();보다는 result = result && returnFalse();에 컴파일 (나는 후자를 예상).

내 질문은 왜 그런가요?

나는 다른 방향 일 것으로 기대합니다. 우리는 모두 연산자보다 훨씬 더 일반적으로 && 연산자를 사용하며 "기본 동작"이라고 기대합니다.


업데이트 : 대부분의 답변은 잘못된 질문에 대답 것으로 보인다.
&&&의 차이점은 &&이 단락된다는 사실입니다. 반면에 &은 항상 두 피연산자를 모두 평가합니다. & 항상 두 피연산자를 평가하는 반면 않습니다 a &= b&&&의 주요 차이점의 a = a && b;

+0

아마도이 경우 && =라고합니다. –

+0

가능한 복제본 [이 C# 코드의 "& ="는 무엇을합니까?] (http://stackoverflow.com/questions/4556027/what-does-the-in-this-c-sharp-code-do) –

+0

@ MarkPattison 그것에 대해 생각해도이 연산자가 있는지 확인하기 위해 검색 중이 었으며 나는 그 사실을 모르고 있습니다. –

답변

2

당신이에 실패 혼란으로 변환됩니다 같은 RESON를 들어, 당신이 숫자 값에 &&&을 사용할 때 차이가있는 경우 하지만 바이트 컨텍스트에서 부울에 사용할 때는 없습니다.

차이점은 &&을 사용하면 단락이 발생한다는 것입니다.

boolean result = false & true; //bitwise AND 
boolean result = false && true; //logical AND 

결과에는 차이가 없습니다. 그렇다면 차이점은 CPU가 어떻게 처리 할 것인가입니다.

이 경우 부울 값으로 연산자 &=을 사용하는 경우 result = value & value을 사용하는 것과 같습니다.

&=을 사용할 때 단락이 발생한다는 가정은 이해하기 쉽지 않습니다. 여기서 &&이라는 인수가 &보다 자주 사용되는 인수는 여기에서 장소를 찾지 못합니다. &은 비트 단위 논리 연산자이고 &&은 논리적이기 때문에. 따라서 &=은 그 의미가 자연스러운 것입니다.

+0

답변 해 주셔서 감사합니다. 명확하고 잘 설명되어 있습니다. –

+0

환영합니다. ;-) –

0

&&이 단락이 있다는 것입니다보다는 a = a & b;로 변환하는 이유

질문

이었다.

result &= returnFalse();result = result & returnFalse();과 동등하다.

+0

답변 해 주셔서 감사합니다. 나는 그것을 알고있다. 필자가 쓴대로, 나는'result = result && returnFalse(); '와 동등 할 것으로 기대했다. –

+0

그것을 알고 있다면, 왜 질문을 하는가? 아니면 여기 누군가가 C#의 신들과 대화하기를 바랬습니까? –

+0

@ david.pfx 오타를 유감스럽게 생각합니다. 나는'result = result && returnFalse();'- 주석이 업데이트되었음을 ​​의미했습니다. 질문은 그 이유가 무엇인지에 관한 것입니다. –

1

당신은 "실행 된"얻었 기 때문에

Func<bool> returnFalse =() => 
{ 
    funcExecuted = true; //THIS !!!!!! 
    return false; 
}; 

의 메시지와 해당

string msg = funcExecuted?"Executed":"Not Executed"; 

funcExceutedtrue (제공된 코드의 범위에) 항상있다.

result &= returnFalse(); 

result = result & returnFalse(); 

을하지만 것은 조건이 result 확인하지 않는다는 것입니다,하지만 :

당신이 쓴 바이너리 &의 코드는 실제로 당신이 무엇을 기대로 변환된다 funcExceuted입니다. 이 코드는 으로 변경하면 코드에서 예상되는 동작을 얻을 수 있습니다.

무엇

그 이유

어떻습니까?

C# 언어 구문은

left+=rightleft = left + right

+2

그는 왜 결과가 뭔지 묻지 않고'var a = a && b '또는'& ='가'a & b'가 아닌'a & b'를 생성하는 이유를 알고 싶어합니다. – germi

+0

@germi : 그는 왜 코드가 "실행되지 않음"을 표시하지 않는지 묻습니다. 대답은 : codintion이 잘못된 변수를 검사합니다. – Tigran

+2

@Tigran 그는'result'가'false'를 시작하기 때문에'result && returnFalse()'가 짧은 cicruit을 사용하기 때문에 함수가 전혀 실행되지 않을 것으로 예상했습니다. – Rotem