Приоритет операторов: & vs == в Python
@python_quizРазберем этот квиз
Короткое условие: в коде используются два целых в битовом виде и выражение с тернарным оператором:

Разберём по шагам, почему программа выводит то, что выводит, и что имелось в виду в вариантах ответа.
Как Python парсит выражение
В Python оператор побитового AND (&) имеет более высокий приоритет, чем сравнительные операторы (==, !=, <, > и т.д.). Это значит, что выражение
flags & mask == mask
интерпретируется как
(flags & mask) == mask
а не как
flags & (mask == mask)
Вычисления для конкретных значений
- flags = 0b1010 (десятичное 10)
- mask = 0b0101 (десятичное 5)
Выполним операции явно:

Ожидаемый вывод — строка NO.
Почему не произойдёт TypeError
Вариант, предполагающий исключение TypeError, неверен: побитовый AND применяется к целым числам, и сравнение возвращает булево; все операции в коде корректны по типам. Кроме того, булевы значения в Python — подкласс int, поэтому выражения вроде flags & True тоже допустимы.
Пример демонстрации, если бы сравнение было выполнено раньше (чтобы показать возможную путаницу):

Но реальное поведение — сначала &, затем ==.
Анализ вариантов ответа (коротко)
- "Выведет OK, так как все биты mask установлены во flags" — неверно. Биты mask (0101) не установлены в flags (1010); побитовое И даёт 0000.
- "Выведет NO, так как приоритет == выше, чем &" — неверно: приоритет у & выше, и утверждение о приоритете неверно (хотя итог в данном конкретном примере всё равно NO, но по другой причине).
- "Выведет NO, так как приоритет & выше, чем ==" — верное объяснение: выполняется (flags & mask) == mask → 0 == 5 → False → NO.
- "Код упадёт с исключением
TypeError" — неверно: операции корректны по типам.
Рекомендации и вывод
- Когда смешиваются побитовые и сравнительные операции, предпочитайте явные скобки для читаемости: (flags & mask) == mask.
- Помните: побитовые операторы (&, |, ^) имеют более высокий приоритет, чем операторы сравнения.
- Проверяйте бинарные представления, если вы рассуждаете о «совпадении битов» — в приведённом примере ни один из битов mask не совпадает с установленными битами flags.
Это краткое практическое правило поможет избежать логических ошибок и недопонимания при чтении подобных выражений.