Что произойдет, если первая часть if-структуры ложна?
Мне было интересно, что происходит, когда программа обрабатывает if-структуру с несколькими условиями. У меня есть идея, но я не уверен в этом. Я приведу пример:
List<string> myTestList = null;
if (myTestList != null && myTestList.Count > 0)
{
//process
}
Список имеет значение null. При обработке оператора if будет ли он идти слева направо, выходя из if, если одно условие является ложным?
Я пробовал это и, кажется, не выдавал ошибок, поэтому я предполагаю, что это объясняет выше, но я не уверен.
Ответы
Ответ 1
Это важно &&
. Это короткое замыкание, поэтому Count
никогда не оценивается; Условия оцениваются слева направо.
Существует также оператор с коротким замыканием (&
), но он редко встречается очень в тесте if; он в основном предназначен для побитовых операций (на int
и т.д.).
Из спецификации:
Условные логические операторы
Операторы &&
и ||
называются условными логическими операторами. Их также называют "коротких замыканий" логических операторов.
...
Операторы &&
и ||
являются условными версиями &
и |
операторы:
- Операция
x && y
соответствует операции x & y
, за исключением того, что y
оценивается только в том случае, если x
не false
. - Операция
x || y
соответствует операции x | y
, за исключением того, что y
оценивается, только если x
не true
.
Ответ 2
В большинстве (но не всех) современных языках существует функция "булевая оценка короткого замыкания" . Это означает, что если первая часть условия &&
является ложной, то вторая часть вообще не оценивается.
Аналогичная функция применяется к ||
, где, если первая часть истинна, вторая часть не оценивается.
Обратите внимание, что эта функция не ограничивается операторами if
. Также справедливо следующее: он не будет пытаться ссылаться на Count
, если myTestList
есть null
:
bool b = myTestList != null && myTestList.Count > 0;
Ответ 3
В С# и большинстве языков &&
и ||
закорочены, т.е. если первой части выражения достаточно для определения результата, вторая часть гарантируется, что она не будет выполнена.
Используемый код - идиоматический код С#.
Ответ 4
Оценка будет немедленно остановлена, если ссылка null
. Это называется оценкой коротких замыканий логических выражений - если левая часть &&
равна false
, право вообще не оценивается.
Ответ 5
Он закорочен.
a && b
if a
false, b
не будет оцениваться. Мы можем использовать это поведение, потому что выражение всегда будет ложным.
Аналогично,
a || b
Если a
истинно, b
не будет оцениваться.
Ответ 6
Большинство современных языков программирования, включая С#, реализуют так называемый оператор последовательной связи Маккарти. Это означает:
a && b <=> a ? b : false
Если вы посмотрите на второе из этих двух эквивалентных выражений, становится совершенно ясно, что b
оценивается тогда и только тогда, когда a
истинно. И наоборот:
a || b <=> a ? true : b
Ответ 7
Да, следует использовать оценку короткого замыкания. Я сам не разработчик С#, но я прочитал это из этой статьи в Википедии.
Ответ 8
Для следующей примерной программы:
void test()
{
bool f1 = 0;
bool f2 = 0;
если (f2 && (f1 = 1))
{cout < "Внутри 1" < епсИ; }
cout < "F1" < f1 < ": F2:" < f2 < епсИ;
if ((f1 = 1) & f2)
{cout < "Внутри 2" < епсИ; }
cout < "F1" < f1 < ": F2:" < f2 < епсИ;
}
Результат:
F1 0: F2: 0
F1 1: F2: 0
Что в основном показывает, что цикл if выполняется слева направо.
1. В первом цикле if первое условие терпит неудачу, и он не пытается проверить вторую часть.
2. Во втором цикле if сначала выполняется первая часть, а затем вторая часть.
Это будет работать для С++. Надеюсь, это поможет.