C # условный приоритет И (&&) ИЛИ (||)
-
20-09-2019 - |
Вопрос
На моей работе мы постоянно сталкиваемся с ненужными аргументами в пользу кодирования.Сегодня я спросил, имеет ли условное И (&&) или ИЛИ (||) более высокий приоритет.Один из моих коллег настаивал на том, что у них одинаковый приоритет, у меня были сомнения, поэтому я посмотрел это.
Согласно MSDN, AND (&&) имеет более высокий приоритет, чем OR (||).Но можете ли вы доказать это скептически настроенному коллеге?
http://msdn.microsoft.com/en-us/library/aa691323 (ПРОТИВ 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 (||)?Если ваш ответ таков, что это не имеет значения, то почему это так построено в языке?
Решение
Измените первое значение false на true.Я знаю, это кажется глупым иметь (true || 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;
Вы доказываете это не с помощью кода, а с помощью логики.И является логическим умножением, тогда как ИЛИ является логическим сложением.Итак, какой из них имеет более высокий приоритет?
ложь || истина && true
Урожайность:верно
false && true || истинный
Урожайность:верно
Вы не можете просто показать конечный результат, когда ваши логические выражения замыкаются накоротко.Вот фрагмент, который улаживает ваше дело.
Он основан на реализации операторов & и |, используемых && и || , как указано в 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 и посмотрите, что происходит при коротком замыкании.