когда я использую операторы if с несколькими условиями, как они управляются в компиляторе?
A) игнорирует ли это второе выражение, если первое утверждение не выполняется или наоборот?
If(time > 3.0 && hitEnabled)
B) Часто рекомендуются поздние ошибки, поэтому я предпочитаю использовать одно условие в операторах if?
if(time > 3.0)
if(hitEnabled)
Благодарю!
if(time > 3.0 && hitEnabled)
В вышеприведенном заявлении hitEnabled
не будет оцениваться, когда time > 3.0
является ложным.
Это называется короткое замыкание.
Следующий оператор будет оценивать hitEnabled
даже когда time > 3.0
является ложным, но возвращает true, когда оба операнда true
.
if(time > 3.0 & hitEnabled)//note bitwise &
if(time > 3.0)
if(hitEnabled)
Вложенные операторы if полезны, когда вам нужно проверять первое условие много раз и т.д.
if(time > 3.0 && hitEnabled)
{
//DoSomething1
}
if(time > 3.0 && flag)
{
//DoSomething2
}
Это можно записать с помощью вложенных операторов if следующим образом
if(time > 3.0)
{
if(hitEnabled)
{
//DoSomething1
}
if(flag)
{
//DoSomething2
}
}
В этом случае я предпочитаю вложенный оператор if, чтобы избежать ненужных проверок
В случае &&
если первое условие ложно, второе условие никогда не будет оценено, а общий результат будет ложным. В случае ||
, если первое условие истинно, второе условие не оценивается и общий результат является истинным. Как заметил Роб, он известен как оценка короткого замыкания.
Это полезно в тех случаях, когда мы хотим оценить второй операнд, if
выражение, только если первый операнд возвращает истинный. Например, мы можем проверить правильность переменной перед ее использованием.
if(ptr != NULL && *ptr > x)
В этом случае значение ptr
будет проверяться на x только в том случае, если оно не NULL
.
A) Он не будет проверять hitEnabled, если первое условие будет ложным, если вы хотите сделать это, вы должны использовать короткое замыкание AND (&), как показано ниже. Даже если первое условие будет False, оно будет проверять второе.
If(time > 3.0 & hitEnabled)
B) Это сильно зависит от того, что вы хотите от своего приложения, и меньше от производительности вашего оборудования. Если вы хотите проверить оба условия в любом случае, опция B - это прекрасно, но если вы уверены, что если время> 3.0 является ложным, и вы не хотите проверять второй, опция A предпочтительнее, на мой взгляд. Как я уже говорил, это сильно зависит от логики вашей программы, поэтому вы не можете получить правильный ответ на основе одной строки кода.
Если вы зададите вопрос о том, что лучше писать без логического фона, это зависит от вас. Оба варианта легко читаются, если следовать правилам кода.
Если первое условие нарушено, оно не проверяет второе, и оно просто игнорируется. Если вы хотите поместить любой код, всегда лучше сделать его вложенным.
В первом случае:
If(time > 3.0 && hitEnabled)
Если time > 3.0
false, тогда hitEnabled
никогда не будет проверяться. И он всегда начинает проверять условия слева направо.
Если вы хотите убедиться, что все условия будут проверены, вы должны использовать ||
(логическое OR
) вместо &&
(логическое AND
), например:
If(time > 3.0 || hitEnabled)
Эта:
if(time > 3.0 && hitEnabled)
равняется
if(time > 3.0)
if(hitEnabled)
Оценка выражения останавливается, как только это будет окончательно истинным или ложным.
Это позволяет выражениям, например if (x != null && x.property...
поскольку x.property не будет оцениваться, если x равно null и т.д.
String someString = null;
if (someString != null && someString[4].Equals('a'))
{
//// not called
}
if (someString != null || someString[4].Equals('a'))
{
//// exception
}
Console.ReadLine();
&&
и&
. Неявные преобразования также работают по-разному, и, если речь идет о неявных преобразованиях, вы можете получитьa & b
false, даже еслиa
иb
имеют значение true.EvilBool
?