Подтвердить что ты не робот

С# условное И (&&) ИЛИ (||) приоритет

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

4b9b3361

Ответ 1

Измените первое значение false на значение true. Я знаю, что глупо иметь (true || true), но это доказывает вашу мысль.

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

Ответ 2

Если вы действительно хотите его выучить, попробуйте:

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:

В ответ на комментарий:

В С# | - логический оператор, который выполняет ту же логическую логику, что и ||, но не замыкается. Также в С# оператор | имеет более высокий приоритет, чем || и &&.

Выбрав значения, вы можете увидеть, что если бы я использовал типичный оператор ||, был бы напечатан только первый True, за которым следует результат выражения, которое было бы также True.

Но из-за более высокого приоритета | сначала оценивается true | false (в результате получается True), а затем этот результат && ed с false, чтобы получить false.

Я не пытался показать порядок оценки, просто тот факт, что правая половина | была оценена периодом, когда обычно это не было:)

Ответ 3

Разве это не привело бы вас к тому, что вам нужно? Или, может быть, я что-то пропустил...

bool result = true || false && false;

Ответ 4

Вы не доказываете это с помощью кода, а с логикой. AND является булевым умножением, тогда как OR является булевым добавлением. Теперь какой из них имеет более высокий приоритет?

Ответ 5

false || true && правда

Допустимые значения: true

false && & true || правда

Допустимые значения: true

Ответ 6

Вы не можете просто показать конечный результат, когда ваши булевы выражения закорочены. Вот фрагмент, который решает ваш случай.

Он полагается на реализацию и и | операторы, используемые && и ||, как указано в 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 и посмотреть, что происходит при коротком замыкании.