Гарантируется ли, что оператор 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, но требования типа операнда, категории значения и порядка вычисления заменяются правилами для вызова функции. [...] - конец примечания ]