Гарантируется ли, что оператор if не будет оцениваться больше, чем необходимо?

Учитывая два условия с && подключение. Я знаю, что порядок оценки слева направо. Но если первое условие разрешается как ложное, второе условие гарантированно не будет оценено?

#define SIZE
bool array[SIZE];
int index;

// play with variables
// ...

if(index < SIZE && array[index])
{
    // ...
}

В этом примере, если первое условие ложно, второе не должно оцениваться, так как доступ в массиве будет вне диапазона.

Кстати, я не могу просто вложить условные обозначения с двумя if заявления, так как на самом деле мне нужно обратное, как (!(in_range && get_element)), С вложенными утверждениями мне нужно было бы использовать goto перепрыгнуть через блок кода ниже.

1 ответ

Решение

Но если первое условие разрешается как ложное, второе условие гарантированно не будет оценено?

Да, это короткое замыкание C++. В соответствии с пунктом 5.14/1 стандарта C++11:

&& оператор группы слева направо. Оба операнда контекстуально преобразуются в bool (Пункт 4). Результат true если оба операнда true а также false иначе. В отличие от &, && гарантирует вычисление слева направо: второй операнд не оценивается, если первый операнд false,

Как МатьеМ. Правильно упоминается в комментариях, вышеприведенное применимо только к встроенным логическим операторам И и логическим операторам ИЛИ: если эти операторы перегружены, их вызов обрабатывается как обычный вызов функции (поэтому короткое замыкание не применяется и порядок вычисления не гарантировано).

Как указано в пункте 5/2:

[ Примечание: операторы могут быть перегружены, то есть заданы значения при применении к выражениям типа класса (раздел 9) или типа перечисления (7.2). Использование перегруженных операторов преобразуется в вызовы функций, как описано в 13.5. Перегруженные операторы подчиняются правилам синтаксиса, указанным в разделе 5, но требования типа операнда, категории значения и порядка вычисления заменяются правилами для вызова функции. [...] - конец примечания ]

Другие вопросы по тегам