[C++] 연산자

꿈별·2022년 8월 13일
0

C++

목록 보기
3/27

+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;

/* 
+ 연산 결과 -> 13
- 연산 결과 -> 9
* 연산 결과 -> 13
/ 연산 결과 -> 5
% 연산 결과 -> 1
*/

대입 연산자

  • 변수에 값을 대입할 때 사용하는 연산자.
  • 두 개의 피연산자를 가지는 이항 연산자.
    -> 피연산자들의 결합 방향은 오른쪽에서 왼쪽
대입 연산자설명
=왼쪽 피연산자에 오른쪽 피연산자를 대입
+=왼쪽 피연산자에 오른쪽 피연산자를 더한 후 그 값을 왼쪽 피연산자에 대입
-=왼쪽 피연산자에 오른쪽 피연산자를 뺸 후 그 값을 왼쪽 피연산자에 대입
*=왼쪽 피연산자에 오른쪽 피연산자를 곱한 후 그 값을 왼쪽 피연산자에 대입
/=왼쪽 피연산자에 오른쪽 피연산자를 나눈 후 그 값을 왼쪽 피연산자에 대입
%=왼쪽 피연산자에 오른쪽 피연산자를 나눈 후 그 나머지를 왼쪽 피연산자에 대입

증감 연산자

  • 피연산자를 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;

/* 결과
++num1 - 3 : 1, num1 : 4
num2++ - 3 : 0, num2 : 4
*/

비교 연산자

  • 두 피연산자를 비교하는 데 사용되는 연산자.
증감 연산자설명
==두 피연산자의 값이 같으면 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 = byte << 3 와 byte <<= 3는 같음
	byte <<= 3; // 2^n 을 곱하기
    byte >>= 2; // 2^n 로 나눈 몫

게임에서의 비트 연산

  • 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 //2^0 = 1,	 0
#define THIRSTY	2 //2^1 = 2,   1 0
#define TIRED	4 //2^2 = 4, 1 0 0

...
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

💡 각 상태에 대응하는 숫자 규칙적으로 작성하기

#define HUNGRY	0x1
#define THIRSTY	0x2
#define TIRED	0x4
#define FIRE	0x8

#define NAME0	0x10 // 10진수 : 16
#define NAME1	0x20 // 10진수 : 32
#define NAME2	0x40 // 10진수 : 64
#define NAME3	0x80 // 10진수 : 128

#define NAME4	0x100 // 10진수 : 256
#define NAME5	0x200 // 10진수 : 512
#define NAME6	0x400 // 10진수 : 1024
#define NAME7	0x800 // 10진수 : 2056
...

삼항 연산자

  • 조건식 ? 반환값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

0개의 댓글