При написании такого кода на C ++:
bool allTrue = true;
allTrue = allTrue && check_foo();
allTrue = allTrue && check_bar();
check_bar()
не будет оцениваться, если check_foo()
возвращенный false
, Это называется оценка короткого замыкания или короткого замыкания и является частью принципа ленивой оценки.
Работает ли это с составным оператором присваивания? &=
?
bool allTrue = true;
allTrue &= check_foo();
allTrue &= check_bar(); //what now?
Для логического OR
заменить все &
с |
а также true
с false
,
Из C ++ 11 5.17 Assignment and compound assignment operators
:
Поведение выражения вида E1 op = E2 эквивалентно E1 = E1 op E2, за исключением того, что E1 оценивается только один раз.
Тем не менее, вы смешиваете логическое И которое делает короткое замыкание, и побитовое И, который никогда не делает.
Фрагмент текста &&=
что бы вы делали то, о чем вы спрашиваете, нигде быть найденным в стандарте. Причина этого в том, что он на самом деле не существует: нет логического оператора и оператора присваивания.
Оценка короткого замыкания (то есть ленивая) только для логического &&
а также ||
, побитовое &
а также |
оцените оба аргумента.
Нет, они не коротко.
Обратите внимание, что &=
а также |=
операторы формируются как &
+=
а также |
+=
, Битовые операторы &
а также |
не выполняет оценку ярлыков.
Только булевы операторы &&
а также ||
выполнить это.
Это означает, что оператор быстрого вызова должен быть традиционно назван &&=
а также ||=
, Некоторые языки предоставляют их. C / C ++ нет.
Код allTrue &= check_foo();
эквивалентно allTrue = allTrue & check_foo()
В котором вы используете bitwise AND
и ленивая оценка не выполняется.
bitwise AND
должен принять два аргумента, двоичное представление которых имеет одинаковую длину, и используетlogical AND
операция для сравнения каждой соответствующей пары бит.
Первый: a &= b;
это не то же самое, что a = a && b;
, a &= b;
средства a = a & b;
, В C / C ++ нет a &&= b;
,
Логическое И a && b
немного похоже на тест на 1 бит. Если первый «бит» уже равен 0, то результат всегда будет равен 0, независимо от второго. Так что не стоит оценивать b
если результат уже ясен из a
, Стандарт C / C ++ позволяет эту оптимизацию.
Побитовое И a & b
выполняет этот тест для всех битов a
а также b
, Так b
необходимо оценить, если хотя бы один бит в a
было бы ненулевым. Вы могли бы пожелать этого, если a==0
, чем b
не будет оцениваться, но эта оптимизация не разрешена в C / C ++.
поскольку & является битовой операцией, check_foo () будет вычисляться первым независимо от значения allTrue в
allTrue &= check_foo(); // also for allTrue = allTrue & check_foo();
а также
allTrue &= check_bar(); // also for allTrue = allTrue & check_bar();
Однако check_foo () не будет вызываться, если вы используете && и все верно, как в:
allTrue = allTrue && check_foo();