2012-10-28 3 views
2

저는 C#에서 느린 평가를 사용한다고 들었습니다. 따라서 if (true || DoExpensiveOperation()과 같은 특정 코드의 경우 DoExpensiveOperation()을 실행하지 않고 true을 반환합니다. 나는 다음과 같은 질문을보고 면접 시험에 게으른 평가가 그렇게 게으르지 않습니까?

,

static bool WriteIfTrue(bool argument) 
{ 
    if (argument) 
    { 
     Console.WriteLine("argument is true!"); 
    } 

    return argument; 
} 

static void Main() 
{ 
    // 1    0      0     1 
    WriteIfTrue((WriteIfTrue(false) & WriteIfTrue(true)) || WriteIfTrue(true)); 

    // 1    1      0      1 
    WriteIfTrue((WriteIfTrue(true) || WriteIfTrue(false)) & WriteIfTrue(true)); 

    // 0     0     0     0 
    WriteIfTrue((WriteIfTrue(false) & WriteIfTrue(true)) & WriteIfTrue(false)); 

    // 1    1      0     1 
    WriteIfTrue((WriteIfTrue(true) || WriteIfTrue(false)) & WriteIfTrue(true)); 
} 

몇 번 인쇄 할 것 "인수는 사실이다!" 화면에?

나는 7이 정답이라고 말할 것입니다. 이제 컴파일러에 집어 넣고 실행하면 10 번 인쇄됩니다! 게으른 평가는 어디에서 모두 잘못 되었습니까?

+9

그 && && 연산자는 무엇입니까? – Dialecticus

+5

그건 게으른 평가가 아니며, 단락 중입니다. 또한, 비트 연산자 ('&')와 논리 연산자 ('||')를 섞어서 사용하고 있습니다. –

답변

34

저는 C#에서 느린 평가를 사용한다고 들었습니다.

동의 할만한 의견이 너무 많습니다. C#에있는 ||&& 연산자가 단락되어 있다고 말한 경우 전체 결과를 첫 번째 피연산자 (즉, ,)에서 확인할 수없는 경우에만 두 번째 피연산자를 계산하면됩니다. Lazy 평가는보다 광범위한 개념입니다. 예를 들어 LINQ 쿼리는 결과가 사용될 때까지 실제로 데이터를 가져 오지 않고 지연 (또는 지연) 평가를 사용합니다.

당신은 단락되지 않습니다 & operator, 사용하고

: 두 사업자에 관계없이 첫 번째 값의

& 연산자는 평가를. AND 연산의 결과가 거짓이므로

x && yx 거짓이면 y 평가하지 않은 것 이외에는 조작 x & y에 해당하는 연산 :

&& operator 단락 인 y의 값이 무엇이든 상관 없습니다.

코드에서 사방 &&& 교체, 당신은 볼 수 있습니다 "인수는 사실이다!" 8 번 인쇄합니다 (7 회는 아니며 귀하의 의견을 다시 계산하십시오).

+0

테스트에서 && 및 && 인 경우 정직하게 기억할 수 없습니다. 내가 그것을 테스트 할 때 예기치 않은 행동을 설명 할 것이다, 고마워! –

관련 문제