C# условный и ( & & ) или ( | | ) приоритет
мы все время попадаем в ненужные аргументы кодирования на моей работе. Сегодня я спросил, имеют ли условные и ( & & ) или или ( | | ) более высокий приоритет. Один из моих коллег настаивал, что они имеют одинаковый приоритет, у меня были сомнения, поэтому я посмотрел его.
согласно 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
Так мой вопрос в том, как вы доказываете с помощью кода, что AND (&&) имеет более высокий приоритет, чем OR (||)? Если ваш ответ не имеет значения, то почему он построен таким образом на языке?
6 ответов
измените первое значение 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
Edit:
в ответ на комментарий:
В C#|
- логический оператор, выполняющий ту же логическую логику, что и ||
, но не короткое замыкание. Также в C#|
оператор имеет более высокий приоритет, чем ||
и &&
.
распечатав значения, вы можете увидеть, что если я использовал типичный ||
оператор, только первый True
будет напечатано-с последующим результатом выражения, которое было бы True
также.
но из-за более высокого приоритета |
на true | false
сначала оценивается (в результате true
) и затем что это &&
С false
выход false
.
я не пытался показать порядок оценки, просто тот факт, что правая половина |
была оценена период, когда это обычно не было бы:)
вы не доказываете это с помощью кода, но с логикой. И-это логическое умножение, а или логическое сложение. Кто из них имеет более высокий приоритет?
разве это не даст вам то, что вы ищете? Или я что-то упускаю...
bool result = true || false && false;
вы не можете просто показать конечный результат, когда ваши логические выражения закорачиваются. Вот фрагмент, который решает ваше дело.
он полагается на реализацию & и / операторов, используемых && и||, как указано в 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 и посмотрите, что произойдет с короткое замыкание.