IT박스

C # 조건부 AND (&&) OR (||) 우선 순위

itboxs 2020. 11. 8. 09:41
반응형

C # 조건부 AND (&&) OR (||) 우선 순위


우리는 항상 제 작업에서 불필요한 코딩 논쟁을합니다. 오늘 저는 조건부 AND (&&) 또는 OR (||)의 우선 순위가 더 높은지 물었습니다. 동료 중 한 명이 같은 우선 순위를 가지고 있다고 주장했고 의심이있어서 찾아 보았습니다.

MSDN에 따르면 AND (&&)는 OR (||)보다 우선 순위가 높습니다. 그러나 회의적인 동료에게 그것을 증명할 수 있습니까?

http://msdn.microsoft.com/en-us/library/aa691323(VS.71).aspx

bool result = false || true && false; // --> false
// is the same result as
bool result = (false || true) && false; // --> false
// even though I know that the first statement is evaluated as 
bool result = false || (true && false); // --> false

그래서 제 질문은 AND (&&)가 OR (||)보다 우선 순위가 높다는 것을 코드로 어떻게 증명합니까? 당신의 대답이 중요하지 않다면 왜 그 언어로 그렇게 만들어 졌습니까?


첫 번째 거짓을 참으로 변경하십시오. (사실 || 사실)을 갖는 것이 어리석은 것처럼 보이지만 그것이 당신의 요지를 증명합니다.

bool result = true || true && false;   // --> true 
     result = (true || true) && false; // --> false
     result = true || (true && false); // --> true

정말로 그를 놀라게하고 싶다면 :

bool result = True() | False() && False();

Console.WriteLine("-----");
Console.WriteLine(result);

static bool True()
{
    Console.WriteLine(true);
    return true;
}

static bool False()
{
    Console.WriteLine(false);
    return false;
}

다음과 같이 인쇄됩니다.

True
False
False
-----
False

편집하다:

댓글에 대한 답변 :

C # |에서는와 동일한 부울 논리를 수행 ||하지만 단락되지 않는 논리 연산자입니다 . 또한 C #에서 |연산자는 ||&&.

값을 인쇄하면 일반적인 ||연산자를 사용 하면 첫 번째 연산자 만 True인쇄되고 그 뒤에 식의 결과도 인쇄된다는 것을 알 수 True있습니다.

그러나 인해 높은 우선 순위의 |상기가 true | false평가되고 제 (결과 true)와 그 결과가된다 &&에드 false수율 false.

나는 평가의 순서를 보여 주려고하지 않았고, 단지 오른쪽 절반이 |평상시처럼 평가되지 않았을 때 평가 기간 이었다는 사실 만 알았다. :)


이것이 당신이 추구하는 것을 얻지 않습니까? 아니면 뭔가 빠졌 나봐 ...

bool result = true || false && false;

코드가 아니라 논리로 증명합니다. AND는 부울 곱셈이고 OR는 부울 더하기입니다. 이제 어느 것이 더 높은 우선 순위를 가지고 있습니까?


거짓 || 진짜 진짜

수율 : 참

거짓 && 참 || 진실

수율 : 참


부울 표현식이 단락 될 때 최종 결과를 표시 할 수 없습니다. 다음은 귀하의 사건을 해결하는 스 니펫입니다.

구현 및 | && 및 ||에서 사용하는 연산자 ( MSDN 7.11에 명시된대로) 조건부 논리 연산자

public static void Test()
{
    B t = new B(true);
    B f = new B(false);

    B result = f || t && f;

    Console.WriteLine("-----");
    Console.WriteLine(result);
}

public class B {
    bool val;
    public B(bool val) { this.val = val; }
    public static bool operator true(B b) { return b.val; }
    public static bool operator false(B b) { return !b.val; }
    public static B operator &(B lhs, B rhs) { 
        Console.WriteLine(lhs.ToString() + " & " + rhs.ToString());
        return new B(lhs.val & rhs.val); 
    }
    public static B operator |(B lhs, B rhs) { 
        Console.WriteLine(lhs.ToString() + " | " + rhs.ToString());
        return new B(lhs.val | rhs.val); 
    }
    public override string ToString() { 
        return val.ToString(); 
    }
}

출력은 &&가 ||보다 먼저 평가된다는 것을 보여야합니다.

True & False
False | False
-----
False

더 재미를 위해 result = t || t && f 및 단락으로 어떤 일이 발생하는지 확인하십시오.

참고URL : https://stackoverflow.com/questions/1196703/c-sharp-conditional-and-or-precedence

반응형