이 문서는 C++에서 사용하는 연산자의 모든 종류와 그 내부 원리를 다룬다.
주된 대상은 다음과 같다:
+=, -=, *=, /=, %= 등++, --의 전위/후위 사용 차이<<, >>와 signed/unsigned 시의 차이특히 비트 수준에서의 연산 결과와 음수 처리 주의사항, 연산 시 자동 형변환의 원리까지 폭넓고 정확하게 설명되어 있다.
C++의 기본 수치 연산자로, 두 값을 계산하여 새로운 값을 반환한다.
| 연산자 | 기능 | 사용 예시 | 결과 |
|---|---|---|---|
+ | 덧셈 | 10 + 3 | 13 |
- | 뺄셈 | 10 - 3 | 7 |
* | 곱셈 | 10 * 3 | 30 |
/ | 나눗셈 | 10 / 3 | 3 (정수) |
% | 나머지 | 10 % 3 | 1 |
/ 연산자는 정수형이면 몫만, 실수형이면 소수점까지 반환%는 정수형에만 사용 가능산술 연산과 대입을 한 줄로 처리하는 축약 표현
| 연산자 | 예시 | 의미 |
|---|---|---|
+= | a += 5; | a = a + 5; |
-= | a -= 3; | a = a - 3; |
*= | a *= 2; | a = a * 2; |
/= | a /= 2; | a = a / 2; |
%= | a %= 5; | a = a % 5; |
변수를 1만큼 증가 또는 감소시킬 때 사용
| 연산자 | 형식 | 의미 |
|---|---|---|
++ | ++a | 전위 증가: 증가 후 사용 |
++ | a++ | 후위 증가: 사용 후 증가 |
-- | --a | 전위 감소 |
-- | a-- | 후위 감소 |
a = hp++; → a에는 증가 전 값이 들어감, hp는 이후 증가됨비트를 왼쪽 또는 오른쪽으로 이동시키는 연산자
| 연산자 | 기능 | 예시 | 결과 |
|---|---|---|---|
<< | 왼쪽 시프트 | a << 1 | a * 2 |
>> | 오른쪽 시프트 | a >> 1 | a / 2 |
signed 타입에서 >> 연산은 부호 비트가 유지됨 → 산술 시프트unsigned 타입에서는 0이 채워짐 → 논리 시프트⚠️ 음수 처리 시 반드시 unsigned 타입을 사용하거나, 결과 해석에 주의 필요
여러 연산이 섞여 있을 때 먼저 실행되는 연산자를 정하는 규칙
우선순위 (높음 → 낮음):
1. *, /, %
2. +, -
3. 괄호 ()로 직접 지정 가능
int result = 10 + 5 * 3; // 25
int result2 = (10 + 5) * 3; // 45
(float) 등을 사용하면 의도된 정확한 계산 가능int a = 5;
float b = 2.5;
cout << a + b << endl; // 7.5
int x = 5, y = 2;
float res = (float)x / y; // 2.5
| 개념 | 설명 | 예시 |
|---|---|---|
| 오버플로우 | 최대값 초과 시 최소값으로 순환됨 | unsigned int max = 4294967295; max += 1; // 0 |
| 언더플로우 | 최소값 미만 시 최대값으로 순환됨 | short s = -32768; s -= 1; // 32767 |
| 용어 | 정의 |
|---|---|
| 산술 연산자 | 기본 수학 연산 수행 (+, -, *, /, %) |
| 대입 연산자 | 연산 후 결과를 변수에 저장 (=, += 등) |
| 증감 연산자 | 값을 1만큼 증가 또는 감소 (++, --) |
| 복합 연산자 | 산술 연산 + 대입을 한 줄로 작성 (+=, *= 등) |
| 시프트 연산자 | 비트를 좌/우로 이동 (<<, >>) |
| 전위/후위 연산자 | 증가/감소 시점에 따라 결과가 달라짐 |
| 오버플로우 | 데이터 최대값 초과 시 0으로 순환 |
| 언더플로우 | 최소값 이하 시 최대값으로 순환 |
| 산술 시프트 | 부호 비트를 유지한 채 시프트 (signed) |
| 논리 시프트 | 부호 고려 없이 0을 채워 시프트 (unsigned) |
int a = 10, b = 3;
cout << a + b << endl; // 13
cout << a - b << endl; // 7
cout << a * b << endl; // 30
cout << a / b << endl; // 3
cout << a % b << endl; // 1
/는 정수형이라 소수점 버림%는 오직 정수형에서만 사용 가능int hp = 100;
hp += 5; // hp = 105
hp -= 5; // hp = 100
hp *= 2; // hp = 200
hp /= 2; // hp = 100
a += b는 a = a + b 와 완전히 동일하지만 코드 간결성을 제공int hp = 100;
hp++; // hp = 101 (후위 증가)
int a = hp; // a = 101
++hp; // hp = 102 (전위 증가)
signed char x = -128; // 10000000
x = x >> 1; // 11000000 → -64
unsigned char y = 128; // 10000000
y = y >> 1; // 01000000 → 64
int a = 5, b = 2;
float result = (float)a / b; // 2.5
unsigned int max = 4294967295;
max += 1;
cout << max << endl; // 0
++, --, /, %, >> 등의 연산은 자료형에 따라 다르게 해석되며, 특히 signed/unsigned 차이, 정수/실수 차이는 반드시 구분해서 사용해야 한다.