Вопрос:

Порядок выполнения условий в C # If

c# .net conditional logical-operators short-circuiting

22331 просмотра

8 ответа

11531 Репутация автора

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

Я передал MSDN для проверки того, определен ли порядок выполнения условий; но я не смог найти.

Рассмотрим условие множественной проверки, которое имеет &&логический оператор. Гарантируется ли, что он всегда будет проверять первое условие, а если оно не выполнено, второе условие не будет проверено?

Я использовал подход 1, и он работает хорошо. Ищите ссылку на MSDN, подтверждающую использование.

ОБНОВИТЬ

См. Оценку «короткого замыкания»

КОД

  List<string> employees = null;  

  if (employees != null && employees.Count > 0)
  {
        string theEmployee = employees[0];
  }

  if (employees.Count > 0 && employees != null)
  {
        string theEmployee = employees[0];
  }
Автор: LCJ Источник Размещён: 23.05.2013 10:05

Ответы (8)


10 плюса

57443 Репутация автора

Вы должны использовать:

  if (employees != null && employees.Count > 0)
  {
        string theEmployee = employees[0];
  }

&&будет employees.Countкоротким замыканием и не будет выполнено, если employeesесть null.

В вашем втором примере приложение будет сгенерировано исключение , если employeesэто nullкогда вы пытаетесь Countэлементы в коллекции.

http://msdn.microsoft.com/en-us/library/2a723cdk(v=vs.71).aspx

Автор: Darren Размещён: 23.05.2013 10:07

50 плюса

19114 Репутация автора

Решение

&& и || операторы короткого замыкания. Это:

1) Если && оценивает свой первый операнд как ложный, он не оценивает свой второй операнд.

2) Если || оценивает свой первый операнд как истинный, он не оценивает свой второй операнд.

Это позволяет вам делать проверку на нуль && делать что-то с объектом, как если бы он не был нулевым, второй операнд не оценивается.

Автор: Patashu Размещён: 23.05.2013 10:07

2 плюса

3015 Репутация автора

Оператор условного И (&&) выполняет логическое И своих булевых операндов, но только при необходимости оценивает свой второй операнд.

Автор: Frank Rem Размещён: 23.05.2013 10:07

8 плюса

5329 Репутация автора

Условия проверяются слева направо. &&Оператор будет оценивать только правильное состояние , если левое условие истинно.

Раздел 5.3.3.24 Спецификации языка C # гласит:

5.3.3.24 && выражения

Для выражения expr формы expr-first && expr-second:

● Состояние определенного присваивания переменной v перед expr-firstаналогично состоянию определенного присваивания переменной v перед выражением.

· Определенное состояние присваивания v before expr-secondопределенно присваивается, если состояние v after expr-firstлибо определенно назначено, либо «определенно назначено после истинного выражения». В противном случае он не определен.

· Состояние определенного присваивания переменной v после выражения expr определяется:

o Если состояние v после expr-firstопределенно назначено, то состояние v после expr определенно назначено.

o В противном случае, если состояние v after expr-secondопределенно назначено, а состояние v after expr-first«определенно назначено после ложного выражения», то состояние v после expr определенно назначается.

o В противном случае, если состояние v после expr-secondопределенно назначено или «определенно назначено после истинного выражения», то состояние v после expr «определенно назначено после истинного выражения».

o В противном случае, если состояние v after expr-first«определенно назначено после ложного выражения», а состояние v after expr-second«определенно назначено после ложного выражения», то состояние v после expr «определенно назначается после ложного выражения».

o В противном случае состояние v после expr определенно не назначается.

Таким образом, это дает понять, что expr-first всегда вычисляется, и если true, то и только тогда expr-second также оценивается.

Автор: John Willemse Размещён: 23.05.2013 10:08

3 плюса

4774 Репутация автора

слева направо, в то время как выражение все еще сомнительно.

Автор: G.Y Размещён: 23.05.2013 10:20

0 плюса

834 Репутация автора

Гарантируется ли, что он всегда будет проверять первое условие, а если оно не выполнено, второе условие не будет проверено?

Короткий ответ - да.

Автор: yclkvnc Размещён: 23.05.2013 10:38

0 плюса

7713 Репутация автора

См., Например, эту страницу MSDN для &&, которая описывает оценку короткого замыкания.

Вы можете проверить или доказать последовательность выполнения следующим образом:

int i;
bool b;
b=((i=3)==0 && (i=4)!=0);
Console.WriteLine(i);
b=((i=3)!=0 || (i=4)!=0);
Console.WriteLine(i);

Вы получаете 3 в обоих случаях - это показывает, что в обоих случаях происходит короткое замыкание. С другой стороны, вы могли бы использовать '&' или '|', соответственно, логический оператор, чтобы предотвратить это. Таким образом, вы получите результат 4, потому что оба условия были оценены.

Автор: JeffRSon Размещён: 23.05.2013 10:49

2 плюса

3124 Репутация автора

&& и || операторы часто используются для проверки состояния объекта.

1) Условие «&&» оценивает свой первый операнд как ложное, оно не оценивает свой второй операнд. Если он возвращает true, второе условие оценивается. Если второе условие истинно, то только оно вернет истину. Таким образом, && можно использовать, чтобы убедиться, что все условия выполняются как действительные.

2) "||" условие оценивает свой первый операнд как истинное, оно не оценивает свой второй операнд. Если первое условие оценивается как ложное, то только оно будет оцениваться как второе условие. Если он удовлетворен, он вернет истину. В противном случае, ложь.

Автор: Chirag Размещён: 18.03.2014 10:32
32x32