Порядок выполнения условий в C # If
22331 просмотра
8 ответа
Ниже приведены два оператора 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
Источник
Размещён: 13.11.2019 11:41
Ответы (8)
50 плюса
&& и || операторы короткого замыкания. Это:
1) Если && оценивает свой первый операнд как ложный, он не оценивает свой второй операнд.
2) Если || оценивает свой первый операнд как истинный, он не оценивает свой второй операнд.
Это позволяет вам делать проверку на нуль && делать что-то с объектом, как если бы он не был нулевым, второй операнд не оценивается.
Автор: Patashu Размещён: 23.05.2013 10:0710 плюса
Вы должны использовать:
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:078 плюса
Условия проверяются слева направо. &&
Оператор будет оценивать только правильное состояние , если левое условие истинно.
Раздел 5.3.3.24 Спецификации языка C # гласит:
5.3.3.24 && выражения
Для выражения expr формы
expr-first && expr-second
:● Состояние определенного присваивания переменной v перед
expr-first
аналогично состоянию определенного присваивания переменной v перед выражением.· Определенное состояние присваивания v before
expr-second
определенно присваивается, если состояние v afterexpr-first
либо определенно назначено, либо «определенно назначено после истинного выражения». В противном случае он не определен.· Состояние определенного присваивания переменной v после выражения expr определяется:
o Если состояние v после
expr-first
определенно назначено, то состояние v после expr определенно назначено.o В противном случае, если состояние v after
expr-second
определенно назначено, а состояние v afterexpr-first
«определенно назначено после ложного выражения», то состояние v после expr определенно назначается.o В противном случае, если состояние v после
expr-second
определенно назначено или «определенно назначено после истинного выражения», то состояние v после expr «определенно назначено после истинного выражения».o В противном случае, если состояние v after
expr-first
«определенно назначено после ложного выражения», а состояние v afterexpr-second
«определенно назначено после ложного выражения», то состояние v после expr «определенно назначается после ложного выражения».o В противном случае состояние v после expr определенно не назначается.
Таким образом, это дает понять, что expr-first всегда вычисляется, и если true, то и только тогда expr-second также оценивается.
Автор: John Willemse Размещён: 23.05.2013 10:083 плюса
2 плюса
Оператор условного И (&&) выполняет логическое И своих булевых операндов, но только при необходимости оценивает свой второй операнд.
Автор: Frank Rem Размещён: 23.05.2013 10:072 плюса
&& и || операторы часто используются для проверки состояния объекта.
1) Условие «&&» оценивает свой первый операнд как ложное, оно не оценивает свой второй операнд. Если он возвращает true, второе условие оценивается. Если второе условие истинно, то только оно вернет истину. Таким образом, && можно использовать, чтобы убедиться, что все условия выполняются как действительные.
2) "||" условие оценивает свой первый операнд как истинное, оно не оценивает свой второй операнд. Если первое условие оценивается как ложное, то только оно будет оцениваться как второе условие. Если он удовлетворен, он вернет истину. В противном случае, ложь.
Автор: Chirag Размещён: 18.03.2014 10:320 плюса
Гарантируется ли, что он всегда будет проверять первое условие, а если оно не выполнено, второе условие не будет проверено?
Короткий ответ - да.
Автор: yclkvnc Размещён: 23.05.2013 10:380 плюса
См., Например, эту страницу 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Вопросы из категории :
- c# Преобразовать десятичную в двойную?
- c# Как рассчитать чей-то возраст в C #?
- c# Как вы сортируете словарь по значению?
- c# В чем разница между int и Integer в Java и C #?
- .net Как создать новый экземпляр объекта из Типа
- .net Действительно ли опечатанные классы действительно предлагают преимущества?
- conditional PHP условные, скобки нужны?
- conditional mysql подсчитывает строки дочерней таблицы с условием
- conditional MySQL Условная Вставка
- conditional How to write a switch statement in Ruby
- logical-operators Как вы получаете логический xor двух переменных в Python?
- logical-operators Обязательны ли короткие замыкания логических операторов? А порядок оценки?
- logical-operators Приоритет оператора логики SQL: и и или
- logical-operators В чем разница между & и && в MATLAB?
- short-circuiting Есть ли условный троичный оператор в VB.NET?
- short-circuiting В чем разница между операторами Perl (или, и) и (||, &&)?