+23/02/18 수정
✔연산자
- C++은 연산을 위해 다양한 연산자를 제공한다.
산술 연산자
- 사칙연산을 다루는 연산자.
- 두 개의 피연산자를 가지는 이항 연산자.
-> 피연산자들의 결합 방향은 왼쪽에서 오른쪽
| 산술 연산자 | 설명 |
|---|
| + | 왼쪽의 피연산자에 오른쪽의 피연산자를 더함 |
| - | 왼쪽의 피연산자에 오른쪽의 피연산자를 뺌 |
| * | 왼쪽의 피연산자에 오른쪽의 피연산자를 곱함 |
| / | 왼쪽의 피연산자에 오른쪽의 피연산자로 나눔 |
| % | 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 나머지를 반환함 |
int num1 = 11;
int num2 = 2;
cout << "+ 연산 결과 -> " << num1 + num2 << endl;
cout << "- 연산 결과 -> " << num1 - num2 << endl;
cout << "* 연산 결과 -> " << num1 + num2 << endl;
cout << "/ 연산 결과 -> " << num1 / num2 << endl;
cout << "% 연산 결과 -> " << num1 % num2 << endl;
대입 연산자
- 변수에 값을 대입할 때 사용하는 연산자.
- 두 개의 피연산자를 가지는 이항 연산자.
-> 피연산자들의 결합 방향은 오른쪽에서 왼쪽
| 대입 연산자 | 설명 |
|---|
| = | 왼쪽 피연산자에 오른쪽 피연산자를 대입 |
| += | 왼쪽 피연산자에 오른쪽 피연산자를 더한 후 그 값을 왼쪽 피연산자에 대입 |
| -= | 왼쪽 피연산자에 오른쪽 피연산자를 뺸 후 그 값을 왼쪽 피연산자에 대입 |
| *= | 왼쪽 피연산자에 오른쪽 피연산자를 곱한 후 그 값을 왼쪽 피연산자에 대입 |
| /= | 왼쪽 피연산자에 오른쪽 피연산자를 나눈 후 그 값을 왼쪽 피연산자에 대입 |
| %= | 왼쪽 피연산자에 오른쪽 피연산자를 나눈 후 그 나머지를 왼쪽 피연산자에 대입 |
증감 연산자
- 피연산자를 1씩 증가or감소시킬 때 사용하는 연산자.
-> 더 자세히 : 한 단계 증가 or 감소하는 연산자
- 증감 연산자가 붙은 위치에 따라 연산자 우선 순위가 달라진다.
- 전위 ) 먼저 실행한 후, 다른 연산자 수행
- 후위 ) 모든 연산자가 수행된 후, 맨 마지막에 실행됨
| 증감 연산자 | 설명 |
|---|
| ++x (전위) | 피연산자의 값 1 증가시킨 후에 해당 연산을 진행 |
| x++ (후위) | 해당 연산을 먼저 진행한 후에 피연산자의 값을 1 증가시킴 |
| --x (전위) | 피연산자의 값을 1 감소시킨 후에 해당 연산을 진행 |
| x-- (후위) | 해당 연산을 먼저 진행한 후에 피연산자의 값을 1 감소시킴 |
int num1 = 3;
int num2 = 3;
int result1 = 0;
int result2 = 0;
result1 = ++num1 - 3;
result2 = num2++ - 3;
cout << "++num1 - 3 = " << result1 << endl;
cout << "num2++ - 3 = " << result2 << endl;
비교 연산자
| 증감 연산자 | 설명 |
|---|
| == | 두 피연산자의 값이 같으면 1 반환 |
| != | 두 피연산자의 값이 다르면 1 반환 |
| > | 왼쪽 피연산자가 오른쪽 피연산자보다 크면 1 반환 |
| >= | 왼쪽 피연산자가 오른쪽 피연산자보다 크거나 같으면 1 반환 |
| < | 왼쪽 피연산자가 오른쪽 피연산자보다 작으면 1 반환 |
| <= | 왼쪽 피연산자가 오른쪽 피연산자보다 작거나 같으면 1 반환 |
💡 C++에서 거짓(false) : 0이며, 0이 아닌 모든 수는 참(true)으로 인식된다.
논리 연산자
- 주어진 논리식에 대해 참과 거짓을 결정하는 연산자.
| 논리 연산자 | 설명 |
|---|
| && (AND) | 논리식이 모두 참이면 1 반환 |
| || (OR) | 논리식 중 하나라도 참이면 1 반환 |
| ! (NOT) | 논리식 결과가 참이면 0, 거짓이면 1 반환 |
비트 연산자
- 비트 단위로 논리 연산을 할 때 사용하는 연산자.
- 비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용한다.
| 비트 연산자 | 설명 |
|---|
| & (곱, AND) | 대응되는 비트가 모두 1이면 1 반환 |
| | (합, OR) | 대응되는 비트 중에서 하나라도 1이면 1 반환 |
| ^ (XOR) | 대응되는 비트가 서로 같으면 0, 다르면 1 반환 |
| ~ (NOT) | 비트가 1이면 0으로, 0이면 1로 반전시킴 |
| << | 지정한 수만큼 비트들을 전부 왼쪽으로 이동시킴 (left shift 연산) |
| >> | 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산) |
unsigned char byte = 10;
byte <<= 3;
byte >>= 2;
게임에서의 비트 연산
- int형 변수 하나는 32비트(32칸, 4바이트)임
- 따라서 32가지의 상태를 동시에 표현 가능
(각 자리마다 0과 1로 구분, 64비트 등 더 큰 변수도 사용가능)
- 비트 합 연산으로 상태를 추가해 줄 때, 추가할 상태를 제외한 기존 상태들은 변하지 않음
ex) & 연산
1 0 0 1 0 0
0 0 0 0 1 0
ㅡㅡㅡㅡㅡㅡㅡ
1 0 0 1 1 0
#define HUNGRY 1
#define THIRSTY 2
#define TIRED 4
...
unsigned int iStatus = 0;
iStatus |= HUNGRY;
iStatus |= ThIRSTY;
if (iStatus & HUNGRY)
{ ... }
- 상태 제거(특정 자리 비트 제거)
- XOR 연산? ( X )
-> 같으면 0, 다르면 1이 되기 때문에
기존 상태가 0이면, 오히려 1로 상태를 추가해버리게 됨
- 원래 있던 자리 비트 제거?
-> 제거하려는 상태를 반전시켜서 곱 연산 ( O )
💡 기존 비트는 그대로 유지되고,
제거하려는 상태만 0이 됨 (원래 0이어도 0 유지)
iStatus &= ~THIRSTY;
ex)
1 1 1 0 1 0 1 0
1 1 1 1 1 1 0 1 ( 0 0 0 0 0 0 1 0 을 반전시킨 것 )
ㅡㅡㅡㅡㅡㅡㅡㅡㅡ
1 1 1 0 1 0 0 0
💡 각 상태에 대응하는 숫자 규칙적으로 작성하기
- 앞에 0x 붙이고 16진수로 쓰기
- 16진수 : 1 2 3 4 5 6 7 8 9 A B C D E F 10 11...
-> 10진수 <-> 16진수 변환
#define HUNGRY 0x1
#define THIRSTY 0x2
#define TIRED 0x4
#define FIRE 0x8
#define NAME0 0x10
#define NAME1 0x20
#define NAME2 0x40
#define NAME3 0x80
#define NAME4 0x100
#define NAME5 0x200
#define NAME6 0x400
#define NAME7 0x800
...
삼항 연산자
- 조건식 ? 반환값1 : 반환값2 형태로 사용
- 결과가 참이면 반환값1, 거짓이면 반환값2 반환
sizeof 연산자
- 자료형 or 변수 타입마다 할당되는 메모리 크기를 바이트 단위로 반환하는 연산자.
- 사용자의 컴퓨터 환경에 따라 할당되는 메모리의 크기가 다를 수 있다.
연산자 우선순위 & 결합 방향
- 연산자의 우선순위는 수식 내에 여러 개의 연산자가 함께 나올 때, 어떤 연산자가 먼저 처리될 것인지 결정한다.
👉 우선순위
참고
https://min-zero.tistory.com/entry/C-%EA%B8%B0%EB%B3%B8-%EA%B3%B5%EB%B6%80%EC%A0%95%EB%A6%AC-3-%EC%97%B0%EC%82%B0%EC%9E%90operator
http://www.tcpschool.com/cpp/cpp_operator_arithmetic
https://youtu.be/A7LZ5ujCVxM