Условие не должно выполнятся, но оно выполняется

Если a>65, не должно выполняться последнее условие, но тем не менее, оно выполняется. Почему?

import random

N1 = "PzKpfw V Panther"
a = random.randint(0, 100)
b = random.randint(80, 120)
c = random.randint(75,105)
r = random.randint(0, 100)
r1 = random.randint (0,100)
print (a)
br1=90
hp = 450
N2 = "т34-85"
d = random.randint(0,100)
e = random.randint(80,110)
f = random.randint(80,105)
br2=90
hp2= 450
if br1==90:
    print ("PzKpfw V Panther делает выстрел")
if a<65:
    print ("Попадание")
if a>65:
    print ("Промах!")
if r<11:
    print ("Рикошет")
if b>br2&r>11&a<65:
    print ("Броня "+str(N2)+" пробита!")

Ответы (1 шт):

Автор решения: MaxU

Согласно таблице приоритетов выполнения операций побитовое И (&) имеет более высокий приоритет выполнения по сравнению с операторами сравнения. Таким образом сначала выполняются операции побитового И слева-направа и только потом производится сравнение:

b>br2 & r>11 & a<65

будет выполняться в следующем порядке:

  • br2 & r - назовём переменной br2_and_r
  • 11 & a - назовём 11_and_a
  • (b > br2_and_r > 11_and_a) < 65

Пример:

In [87]: a, b, br2, r = 80, 100, 90, 50

In [88]: b>br2 & r>11 & a<65     #  100>90 & 50>11 & 80<65
Out[88]: True

In [89]: b > (br2 & r) > (11 & a) < 65
Out[89]: True

Совет: используйте логическое И (and) вместо побитового И (&):

In [90]: b>br2 and r>11 and a<65
Out[90]: False

и если не уверены в порядке выполнения операций - используйте скобки

→ Ссылка