이번 Step에서 잡아야 할 것

  • 정수 나눗셈: /는 (정수끼리면) 소수점이 버려진다
  • 증감 연산자 함정: hp++++hp는 “값을 사용하는 타이밍”이 다르다
  • 시프트 연산자: (2k2^k) 곱/나눗셈처럼 보이지만, 범위/부호/오버플로우에 주의
  • 우선순위: 헷갈리면 괄호 ()로 의도를 고정한다

산술 연산자

연산자기능
+덧셈
-뺄셈
*곱셈
/나눗셈 (정수끼리면 몫만)
%나머지 (정수만)

정수 나눗셈에서 가장 많이 실수합니다.

int a = 7 / 2;      // 3  (소수점 버림)
double b = 7 / 2;   // 3  (이미 정수 나눗셈이 끝난 뒤 double로 변환)
double c = 7.0 / 2; // 3.5

복합 대입

hp += 5;   // hp = hp + 5;
hp -= 5;   // hp = hp - 5;
hp *= 2;   // hp = hp * 2;
hp /= 2;   // hp = hp / 2;

증감 연산자

hp++;   // 후위: 사용 후 증가
++hp;   // 전위: 증가 후 사용
  • 단독 사용 시: hp++;++hp; 동일
  • a = hp++; → a에는 증가 전 값, hp는 이후 증가
  • a = ++hp; → a에는 증가 후 값

실전 팁: 복잡한 식 안에서 ++/--를 섞으면 읽기 어려워집니다.
초반엔 “한 줄에 한 가지 일”로 분리하는 습관이 안전합니다.

시프트 연산자

  • x << k : 비트를 왼쪽으로 k칸 이동
    • (양수 범위에서) 대략 (xx ×\times 2k2^k)처럼 동작
  • x >> k : 비트를 오른쪽으로 k칸 이동
    • (양수 범위에서) 대략 x2k\left\lfloor \dfrac{x}{2^k} \right\rfloor
      처럼 동작
  • 주의(중요):
    • signed에서 >>는 구현에 따라 부호 비트를 유지(산술 시프트)하는 경우가 많음 → 비트 연산 목적이면 unsigned가 안전한 편
    • 시프트는 범위 밖으로 밀려나가면 정보가 사라집니다(오버플로우/잘림)
int x = 5;        // 0b0101
int y = x << 1;   // 10 (0b1010)
int z = y >> 1;   // 5

연산자 우선순위

  • 곱셈·나눗셈 > 덧셈·뺄셈
  • 괄호 ()로 직접 지정
cout << (100 * (2 + 5) / 2);  // 350

게임에서 활용

  • hp += 5 : 힐
  • hp -= damage : 데미지
  • hp *= 2 : 2배 버프

실전에서는 “범위 제한”을 자주 붙입니다.

hp += heal;
if (hp > maxHp) hp = maxHp;   // 최대치 제한
if (hp < 0) hp = 0;           // 최소치 제한(음수 방지)

체크 질문 (스스로 답해보기)

  • double b = 7 / 2;는 3.5가 아니라 3일까?
  • a = hp++;a = ++hp;의 차이를 “값을 쓰는 시점”으로 설명할 수 있을까?
  • 시프트는 왜 “빠른 곱셈/나눗셈”처럼 보이지만 함정이 있을까?

profile
李家네_공부방

0개의 댓글