Есть ли операторы & amp; = и | = для короткого замыкания bool?

При написании такого кода на 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,

30

Решение

Из C ++ 11 5.17 Assignment and compound assignment operators:

Поведение выражения вида E1 op = E2 эквивалентно E1 = E1 op E2, за исключением того, что E1 оценивается только один раз.

Тем не менее, вы смешиваете логическое И которое делает короткое замыкание, и побитовое И, который никогда не делает.

Фрагмент текста &&=что бы вы делали то, о чем вы спрашиваете, нигде быть найденным в стандарте. Причина этого в том, что он на самом деле не существует: нет логического оператора и оператора присваивания.

37

Другие решения

Оценка короткого замыкания (то есть ленивая) только для логического && а также ||, побитовое & а также | оцените оба аргумента.

9

Нет, они не коротко.

Обратите внимание, что &= а также |= операторы формируются как &+= а также |+=, Битовые операторы & а также | не выполняет оценку ярлыков.

Только булевы операторы && а также || выполнить это.

Это означает, что оператор быстрого вызова должен быть традиционно назван &&= а также ||=, Некоторые языки предоставляют их. C / C ++ нет.

5

Код allTrue &= check_foo(); эквивалентно allTrue = allTrue & check_foo()
В котором вы используете bitwise AND и ленивая оценка не выполняется.

bitwise AND должен принять два аргумента, двоичное представление которых имеет одинаковую длину, и используетlogical AND операция для сравнения каждой соответствующей пары бит.

3

Первый: 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 ++.

1

поскольку & является битовой операцией, 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();
0