Приоритет операторов: & vs == в Python

Приоритет операторов: & vs == в Python

@python_quiz

Разберем этот квиз

Короткое условие: в коде используются два целых в битовом виде и выражение с тернарным оператором:

python

Разберём по шагам, почему программа выводит то, что выводит, и что имелось в виду в вариантах ответа.

Как Python парсит выражение

В Python оператор побитового AND (&) имеет более высокий приоритет, чем сравнительные операторы (==, !=, <, > и т.д.). Это значит, что выражение

flags & mask == mask

интерпретируется как

(flags & mask) == mask

а не как

flags & (mask == mask)

Вычисления для конкретных значений

  • flags = 0b1010 (десятичное 10)
  • mask = 0b0101 (десятичное 5)

Выполним операции явно:

python

Ожидаемый вывод — строка NO.

Почему не произойдёт TypeError

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

Пример демонстрации, если бы сравнение было выполнено раньше (чтобы показать возможную путаницу):

python

Но реальное поведение — сначала &, затем ==.

Анализ вариантов ответа (коротко)

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

Рекомендации и вывод

  • Когда смешиваются побитовые и сравнительные операции, предпочитайте явные скобки для читаемости: (flags & mask) == mask.
  • Помните: побитовые операторы (&, |, ^) имеют более высокий приоритет, чем операторы сравнения.
  • Проверяйте бинарные представления, если вы рассуждаете о «совпадении битов» — в приведённом примере ни один из битов mask не совпадает с установленными битами flags.

Это краткое практическое правило поможет избежать логических ошибок и недопонимания при чтении подобных выражений.

Report Page