Порядок исполнения для if с несколькими условиями - PullRequest
54 голосов
/ 16 марта 2010

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

пример:

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

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

Ответы [ 3 ]

79 голосов
/ 16 марта 2010

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

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

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

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

Вы можете сделать что-то подобное с или:

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

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

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

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

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

30 голосов
/ 16 марта 2010

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

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

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

16 голосов
/ 22 января 2014

Из проекта 3485 (n3485.pdf) В нем четко указано, что

5.14 Логический оператор И [expr.log.and]

logical-and-expression: 
      inclusive-or-expression
      logical-and-expression && inclusive-or-expression 
  1. Группы операторов && слева направо . оба операнда по контексту преобразуются в bool (пункт 4). результат равен true, если оба операнда имеют значение true, а в противном случае - false. В отличие от &, && гарантирует вычисление слева направо : второй операнд не оценивается, если первый операнд является ложным.
  2. Результатом является bool. Если вычисляется второе выражение, вычисляется каждое значение и сторона Эффект, связанный с первым выражением, перед каждым вычисление значения и побочный эффект, связанный со вторым выражение.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...