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
Так мой вопрос в том, как вы докажете с помощью кода, что и (&&) имеет более высокий приоритет, что или (||)? Если ваш ответ не имеет значения, то почему он построен таким образом в языке?
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 и посмотреть, что происходит с короткое замыкание.