Как оценивается оператор 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, а не только к производным. Для поточной и параллельной обработки это другая история;)