Порядок выполнения для, если с несколькими условными выражениями

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

пример:

if(i>0 && array[i]==0){
}

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

55
задан Joel Cunningham 17 August 2016 в 18:57
поделиться

2 ответа

Такой тип оценки называется замыканием. Как только результат становится на 100% ясным, он не продолжает оценку.

На самом деле это распространенный прием программирования. Например, в C++ вы часто увидите что-то вроде:

if (pX!=null && pX->predicate()) { bla bla bla }

Если бы вы изменили порядок условий, вы могли бы вызвать метод на нулевом указателе и потерпеть крах. Аналогичный пример в языке C - использование поля структуры, когда у вас есть указатель на эту структуру.

Вы можете сделать нечто подобное с помощью or:

if(px==null || pX->isEmpty()} { bla bla bla }

Это также одна из причин, по которой обычно хорошо избегать побочных эффектов в условии if.

Например, предположим, что у вас есть:

if(x==4 && (++y>7) && z==9)

Если x равен 4, то y будет увеличен независимо от значения z или y, но если x не равен 4, то он не будет увеличен вообще.

81
ответ дан 26 November 2019 в 17:48
поделиться

Операторы && и || гарантируют, что выражение левой стороны будет полностью оценено (и применены все побочные эффекты) до того, как будет оценена правая сторона. Другими словами, эти операторы вводят точку следования.

Кроме того, если значение выражения можно определить по lhs, то rhs не оценивается. Другими словами, если у вас есть выражение типа x && y, и x оценивается в 0 (false), то значение выражения будет false независимо от y, поэтому y не оценивается.

Это означает, что выражения типа x++ && x++ хорошо определены, так как && вводит точку следования.

32
ответ дан 26 November 2019 в 17:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: