Что происходит, если первая часть if-структуры ложна? - PullRequest
13 голосов
/ 19 мая 2010

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

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

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

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

Ответы [ 8 ]

25 голосов
/ 19 мая 2010

Это &&, что важно. Это короткое замыкание, поэтому Count никогда не оценивается; Условия оцениваются слева направо.

Существует также оператор без короткого замыкания (&), но очень редко можно увидеть в тесте if; в основном предназначен для побитовых операций (на int и т. д.).

Из спецификации:

Условные логические операторы

Операторы && и || называются условными логическими операторами. Их также называют «Короткозамкнутые» логические операторы.

...

Операторы && и || являются условными версиями & и | Операторы:

  • Операция x && y соответствует операции x & y, за исключением того, что y оценивается, только если x не false.
  • Операция x || y соответствует операции x | y, за исключением того, что y оценивается, только если x не true.
6 голосов
/ 19 мая 2010

В большинстве (но не во всех) современных языках есть функция, называемая "логическая оценка короткого замыкания" . Это означает, что если первая часть условия && ложна, то вторая часть вообще не оценивается.

Аналогичная функция применяется к ||, где, если первая часть равна true , вторая часть не оценивается.

Обратите внимание, что эта функция не ограничивается операторами if. Следующее также допустимо и не будет пытаться ссылаться на Count, если myTestList равно null:

bool b = myTestList != null && myTestList.Count > 0;
2 голосов
/ 19 мая 2010

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

a && b <=> a ? b : false

Если вы посмотрите на второе из этих двух эквивалентных выражений, становится совершенно ясно, что b оценивается тогда и только тогда, когда a является истинным И наоборот:

a || b <=> a ? true : b
2 голосов
/ 19 мая 2010

Это короткое замыкание.

a && b

, если a равно false, b не будет оцениваться. Мы можем использовать это поведение, потому что выражение всегда будет ложным.

Аналогично,

a || b

, если a истинно, b не будет оцениваться.

2 голосов
/ 19 мая 2010

Оценка немедленно остановится, если задание будет null. Это называется оценкой короткого замыкания логических выражений - если левая часть && равна false, правая вообще не оценивается.

2 голосов
/ 19 мая 2010

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

Код, который вы использовали - идиоматический код C #.

1 голос
/ 19 мая 2010

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

0 голосов
/ 19 мая 2010

Для следующего примера программы:

void test () { bool f1 = 0; bool f2 = 0;

if (f2 && (f1 = 1)) {cout << "Inside 1" << endl; } cout << "F1" << f1 << ": F2:" << f2 << endl; </p>

if ((f1 = 1) && f2) {cout << "Inside 2" << endl; } cout << "F1" << f1 << ": F2:" << f2 << endl; } </p>

Вывод будет: F1 0: F2: 0

F1 1: F2: 0

Что в основном показывает, что цикл if выполняется слева направо. 1. В первом цикле if первое условие не выполняется, и оно не мешает проверить 2-ю часть. 2. Во втором цикле if сначала выполняется первая часть, а затем вторая часть.

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

  • Ивар
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...