И/ИЛИ (&&/||) логика для нескольких операторов условия

Если у вас есть оператор if в C#, который проверяет несколько условий:

if (a == 5 && b == 9) { ... }

Проверяется ли b == 9, если условие a == 5 ложно, или он автоматически завершает работу, поскольку это больше не может пройти?

Аналогично, для оператора ИЛИ if:

if (a == 5 || b == 9) { ... }

Будет ли по-прежнему проверяться b == 9, если a == 5 верно?


person miguelarcilla    schedule 19.12.2013    source источник
comment
Извините, но прочтите руководство. На этот вопрос можно ответить, ознакомившись с документацией и попробовав ее самостоятельно.   -  person Tim Schmelter    schedule 19.12.2013
comment
@TimSchmelter Достаточно честно. Наверное, я просто не знал, как сформулировать свой вопрос для поисковой системы.   -  person miguelarcilla    schedule 19.12.2013
comment
вы запрашиваете функциональность операторов. Так что в следующий раз вы могли бы включить этот термин в поиск, т.е. Оператор С#.   -  person Tim Schmelter    schedule 19.12.2013


Ответы (6)


И &&, и || являются операторами «короткого замыкания», что означает, что если ответ известен из левого операнда, правый операнд не оценивается.

Это означает, что:

a && b

b не будет оцениваться, если a ложно, поскольку окончательный ответ уже известен.

Так же:

a || b

b не будет оцениваться, если a верно, поскольку окончательный ответ уже известен.

Если вы хотите вычислять оба операнда, используйте вместо них операторы & и |.

Преимущество этого заключается в том, что вы можете писать выражения, которые потерпят неудачу, если будут вычислены все операнды. Вот типичный оператор if:

if (a != null && a.SomeProperty != null && a.SomeProperty.Inner != null)
    ... use a.SomeProperty.Inner

Если бы a было нулевым, и выражение продолжило бы вычисление a.SomeProperty, оно выдало бы NullReferenceException, но поскольку && закорочено, если a равно null, выражение не будет оценивать остальные и, таким образом, не будет генерировать исключение.

Очевидно, что если вы замените && на &, это исключение будет выдано, если a или a.SomeProperty равно null.

person Lasse V. Karlsen    schedule 19.12.2013

Концептуально && и || замыкаются накоротко.

Но поскольку у вас нет никаких побочных эффектов, компилятор JIT может удалить короткое замыкание. Я не знаю, так ли это на самом деле или нет.

person harold    schedule 19.12.2013

Для : if (a == 5 && b == 9) { ... }

Проверяется ли b == 9, если условие a == 5 ложно, или он автоматически завершает работу, поскольку это больше не может пройти?

Если a == 5 равно false, никакие другие элементы управления в этой строке выполняться не будут.

Для: if (a == 5 || b == 9) { ... }

Будет ли b == 9 по-прежнему проверяться, если a == 5 верно?

Немедленно пройдите внутрь, так как первое условие уже удовлетворяет требованиям.

person Tigran    schedule 19.12.2013

Используя оператор И, согласно булевой логике, все условия должны оцениваться как ИСТИНА. Если только одно из них не выполняется, результатом условий будет FALSE.

Проверяется ли b == 9, если условие a == 5 ложно, или он автоматически завершает работу, поскольку это больше не может пройти?

Он автоматически завершается, потому что первое условие ложно, а результат уже известен.

Для оператора ИЛИ нужно, чтобы хотя бы одно из условий было ИСТИНА и ваша логика выполнялась. Если первое не удовлетворяет, приложение проверит остальные условия.

Будет ли b == 9 по-прежнему проверяться, если a == 5 верно?

Нет, проверяться не будет, т.к. первое условие ИСТИННО и дальше другое условие проверять не нужно.

person Alberto Solano    schedule 19.12.2013
comment
Я хочу понять причину этого понижения.. - person Alberto Solano; 19.12.2013

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

if (a != null && a.IsValid) { ... }

В некоторых компиляторах C# это будет работать нормально, в некоторых других вызовет исключение. Вот почему существует стандарт, определяющий общее поведение.

РЕДАКТИРОВАТЬ: уточнено последнее утверждение.

person Zoran Horvat    schedule 19.12.2013

в И проверьте a==5, если верно, то перейдет к b==9 иначе не будет перейти к b==9. в ИЛИ: он проверит a==5 и b==9.

person Fahad Alenazi    schedule 19.12.2013
comment
Привет, user3119036, добро пожаловать в SA. ваш ответ в порядке, но нужно проверить, что я сделал. - person Nahum; 19.12.2013