C# 조건부 및 (&&) 또는 (||) 우선 순위
-
20-09-2019 - |
문제
우리는 항상 내 작업에서 불필요한 코딩 논쟁을 시작합니다. 오늘 나는 조건부와 (&&) 또는 (||)의 우선 순위가 높은지 물었다. 동료 중 한 명이 그들이 같은 우선 순위를 가졌다 고 주장했다. 나는 의심했다. 그래서 나는 그것을 찾았다.
MSDN에 따르면 (&&)는 (||)보다 우선 순위가 높습니다. 그러나 회의적인 동료에게 그것을 증명할 수 있습니까?
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
그래서 내 질문은 코드로 어떻게 증명 하는가 (&&)는 (||)보다 우선 순위가 높습니까? 당신의 대답이 중요하지 않다면 왜 언어로 그런 식으로 만들어 졌습니까?
해결책
True로 첫 번째 거짓을 변경하십시오. 나는 그것이 어리석은 것처럼 보인다는 것을 알고 있지만 (진실) 당신의 요점을 증명합니다.
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;
당신은 코드가 아니라 논리로 그것을 증명합니다. 부울 곱셈은 부울 곱하기입니다. 이제 어느 것이 더 높은 우선 순위를 가지고 있습니까?
거짓 || 진짜 진짜
수율 : 사실
false && true || 진실
수율 : 사실
부울 표현이 단락 될 때 최종 결과를 보여줄 수는 없습니다. 다음은 귀하의 사건을 해결하는 스 니펫입니다.
그것은 & and |를 구현하는 데 의존합니다 명시된대로 && 및 ||에서 사용하는 운영자 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
추가 재미를 위해 결과 = t || t && f와 단락으로 어떤 일이 일어나는지 확인하십시오.