Как оценивается оператор if (A && B)?

if( (A) && (B) )
{
  //do something
}
else
  //do something else

Вопрос в том, будет ли инструкция немедленно разорваться на else, если A было FALSE. Будет ли B даже оценен?

Я спрашиваю об этом в том случае, если B проверяет достоверность индекса массива say array [0], когда массив фактически пуст и имеет нулевые элементы. Поэтому бросаем segfault, потому что мы пытаемся получить доступ к тому, что находится за пределами массива. Конкретно

if( (array.GetElements() > 0) && (array[0]))
  array[0]->doSomething();
else
  //do nothing and return

Это может быть опасно, если массив [0] действительно получает оценку, потому что он segfaults без первой проверки слева от '& &'. Приоритет говорит мне, что левая сторона, безусловно, имеет приоритет, но она не говорит мне, что она не будет оценивать правую сторону, если левая - ЛОЖЬ.

Ответы

Ответ 1

В C и С++ операторы && и || "короткое замыкание". Это означает, что они только оценивают параметр, если это необходимо. Если первый параметр && является ложным или первым значением || является true, остальное не будет оцениваться.

Код, который вы опубликовали, безопасен, хотя я задаю вопрос, почему вы включили пустой блок else.

Ответ 2

Вы спрашиваете об операторе &&, а не о выражении if.

&& короткое замыкание, а это означает, что если во время работы оно соответствует условию, которое приводит к одному ответу, оно перестанет работать и используйте этот ответ.

Итак, 0 && x выполнит 0, а затем завершает работу, потому что нет возможности для выражения для вычисления ненулевого независимо от того, что является вторым параметром &&.

Ответ 3

Да, он называется Оценка короткого замыкания.

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

Это очень важно, когда некоторые из операторов имеют побочные эффекты.

Ответ 4

да, если ((A) && (B)) завершится неудачно в первом предложении, если (A) оценивает значение false.

это относится к любому языку btw, а не только к производным. Для поточной и параллельной обработки это другая история;)