작성
·
289
답변 1
1
안녕하세요! 첫번째 사진의 두번째 줄 if문을 풀어서 읽어보면
event.key == pygame.K_LEFT 가 True일 경우, 즉 '비교'의 결과가 True인 경우
or
event.key == pygame.K_RIGHT 도 '비교'의 결과가 True인 경우에
if 문 안의 내용이 실행됩니다.
하지만 두번째 사진의 두번째 줄은
event.key == pygame.K_LEFT 까지는 동일하지만,
or 연산자 다음에 오는
pygame.K_RIGHT 는
== 과 같은 비교연산이 아닌, pygame.K_RIGHT 라는 pygame 라이브러리 안에 정의된
K_RIGHT 라는 "상수"입니다.
(수정) 괄호가 없을 시 or 보다 == 이 먼저 실행됩니다. *연산자 우선순위)
print(pygame.K_RIGHT)의 결과를 확인해 보세요!
파이썬의 조건문에 오는 0이 아닌 상수는 참으로 취급됩니다.
if (조건문) or (상수) 는 하나만 참이면 True를 반환하는
or 연산자에 의해 (조건문)에 상관 없이 상수로 인해 항상 True가 됩니다.
다음 if문의 결과를 한 번 테스트해보세요
if 1234:
print("1234")
if -1234:
print("-1234")
if 0:
print("0") 이 줄은 출력되지 않습니다
(추가)
event.key == (pygame.K_RIGHT or pygame.K_LEFT)
처럼 괄호로 묶어도 올바른 결과가 나오지 않습니다.
앗... 제가 우선순위를 반대로 말씀드렸네요... 실수했습니다 죄송해요 ㅠㅠ
== 가 or 보다 우선이기 때문에,
a == b or c 는 == 가 먼저 연산되어서
순서가 됩니다.
문법에 오류는 없어 실행은 되지만, 첫번째줄 if문만 통과하면 두번째 if문으로 조건을 건 것은
상수를 대상으로 한 "or" 연산 때문에 항상 참이 되어 어떤 키가 눌렸는지 의미가 없어지는것이 맞습니다.
== 가 or 보다 우선순위를 가지고 있고,
따라서, 제 생각한대로,
pygame.K_LEFT or pygame.K_RIGHT
둘중에 어떤 키든 떨어져도, 라는 조건이 되는게 아니라,
event.key == pygame.K_LEFT
가 떨어지거나, 항상. ( pygame.K_RIGHT 는 상수이므로)
으로 작용하게 되서,
여기선 잘 작동하는 것처럼 보일지는 몰라도, 다른 키와 섞었을떄, 다른키가 떨어질떄에도, 오른쪽 키가 떨어진 것 처럼 작용할 수 있단 말인거죠?( 항상이니까)