Несколько условий в операторе If или разделении

0

когда я использую операторы if с несколькими условиями, как они управляются в компиляторе?

A) игнорирует ли это второе выражение, если первое утверждение не выполняется или наоборот?

If(time > 3.0 && hitEnabled)

B) Часто рекомендуются поздние ошибки, поэтому я предпочитаю использовать одно условие в операторах if?

if(time > 3.0)
    if(hitEnabled)

Благодарю!

Теги:
compiler-construction

7 ответов

3
Лучший ответ
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, чтобы избежать ненужных проверок

  • 0
    Тот факт, что второй операнд всегда вычисляется, не единственная разница между && и & . Неявные преобразования также работают по-разному, и, если речь идет о неявных преобразованиях, вы можете получить a & b false, даже если a и b имеют значение true.
  • 0
    @JamesKanze Я не могу следовать за тобой. Вы говорите о вещи EvilBool ?
Показать ещё 4 комментария
2

В случае && если первое условие ложно, второе условие никогда не будет оценено, а общий результат будет ложным. В случае || , если первое условие истинно, второе условие не оценивается и общий результат является истинным. Как заметил Роб, он известен как оценка короткого замыкания.

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

if(ptr != NULL && *ptr > x)

В этом случае значение ptr будет проверяться на x только в том случае, если оно не NULL.

  • 1
    Это называется оценкой короткого замыкания, чтобы дать ему правильное имя @Kunal. (-:
  • 0
    @RobWells Я добавлю это в ответ. Благодарю.
1

A) Он не будет проверять hitEnabled, если первое условие будет ложным, если вы хотите сделать это, вы должны использовать короткое замыкание AND (&), как показано ниже. Даже если первое условие будет False, оно будет проверять второе.

If(time > 3.0 & hitEnabled)

B) Это сильно зависит от того, что вы хотите от своего приложения, и меньше от производительности вашего оборудования. Если вы хотите проверить оба условия в любом случае, опция B - это прекрасно, но если вы уверены, что если время> 3.0 является ложным, и вы не хотите проверять второй, опция A предпочтительнее, на мой взгляд. Как я уже говорил, это сильно зависит от логики вашей программы, поэтому вы не можете получить правильный ответ на основе одной строки кода.

Если вы зададите вопрос о том, что лучше писать без логического фона, это зависит от вас. Оба варианта легко читаются, если следовать правилам кода.

  • 0
    Когда используется короткое замыкание И, оба оператора проверяются, но если одно из них ложно, весь оператор ложен, так какой смысл использовать короткое замыкание И?
  • 0
    @ user1767754 Это зависит от логики ваших условий. Есть случаи, когда вы хотите проверить, используя оператор AND, если все условия истинны или ложны , а затем вы используете короткое замыкание AND, но если первое условие ложно и вас не волнуют другие условия (будь то истина или ложь) , так что нет никакого смысла использовать & вы можете использовать обычные &&.
0

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

0

В первом случае:

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)
  • 0
    Я знаю, что оператор OR является опцией, мой вопрос был не об операторах, а о том, как компилятор обрабатывает оператор && в условии If
  • 0
    Возможно, я не достаточно ясно дал понять, но это также включено в мой ответ здесь: «Если время> 3.0 ложно, то hitEnabled никогда не будет проверяться. И он всегда начинает проверять условия слева направо.
0

Оценка выражения останавливается, как только это будет окончательно истинным или ложным.

Это позволяет выражениям, например if (x != null && x.property... поскольку x.property не будет оцениваться, если x равно null и т.д.

0
        String someString = null;

        if (someString != null && someString[4].Equals('a'))
        {
            //// not called
        }

        if (someString != null || someString[4].Equals('a'))
        {
            //// exception
        }

        Console.ReadLine();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню