Вопрос

На моей работе мы постоянно сталкиваемся с ненужными аргументами в пользу кодирования.Сегодня я спросил, имеет ли условное И (&&) или ИЛИ (||) более высокий приоритет.Один из моих коллег настаивал на том, что у них одинаковый приоритет, у меня были сомнения, поэтому я посмотрел это.

Согласно 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 и посмотрите, что происходит при коротком замыкании.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top