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

Что произойдет, если первая часть if-структуры ложна?

Мне было интересно, что происходит, когда программа обрабатывает if-структуру с несколькими условиями. У меня есть идея, но я не уверен в этом. Я приведу пример:

List<string> myTestList = null;
if (myTestList != null && myTestList.Count > 0)
{
    //process
}

Список имеет значение null. При обработке оператора if будет ли он идти слева направо, выходя из if, если одно условие является ложным?

Я пробовал это и, кажется, не выдавал ошибок, поэтому я предполагаю, что это объясняет выше, но я не уверен.

4b9b3361

Ответ 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 сначала выполняется первая часть, а затем вторая часть.

Это будет работать для С++. Надеюсь, это поможет.

  • Ивар