[C++] 연산자

hyeona·2024년 2월 6일

C++

목록 보기
3/8
post-thumbnail

📌 연산자

: 연산 명령을 수행시킬 수 있는 것


✔️ 연산자 우선순위(Operator Priority)


1. 대입 연산자

  • =


2. 산술 연산자

(1) 단항 산술 연산자

: 숫자 표현식의 음수 또는 양수 값을 반환한다. 피연산자를 하나만 취한다.

(2) 이항 산술 연산자

: 연산자 왼쪽과 오른쪽에 피연산자를 취한다.

✔️ 정수와 부동 소수점 숫자 나눗셈
-> 두 피연산자 중 하나 이상이 부동 소수점 숫자면 / 연산자는 부동 소수점 나누기를 수행한다.
(Ex. 7.0/3=2.333, 7/3.0=2.333, 7.0/3.0=2.333)


(3) 모듈러 연산자(나머지 연산자)

: 나눗셈의 나머지를 구하는 연산 (Ex) %)
: 정수 피연산자에서만 작동하며 정수 나눗셈을 수행 후 나머지를 반환한다.

(4) 산술 할당 연산자

: 산술을 간결하게 하도록 도와준다.



3. 증감 연산자

: C++에서는 전위(prefix), 후위(postfix)버전의 두 가지 연산이 있다.

(1) 전위 증감 연산자

: 증가 또는 감소한 다음 값 평가

int x = 5;
int y = ++x; //x=6 / y=6

(2) 후위 증감 연산자

: 컴파일러는 x의 임시 복사본을 만든후, 원본 x를 증가 또는 감소시킨 다음 x의 임시 복사본을 평가한다. 이후 x의 임시 복사본이 삭제 된다.

int x = 5;
int y = x++; //x=5 / y=6

-> 컴파일러는 x와 같은 값을 가진 임시 복사본 x(5) 를 만든다.
-> 원본 x를 5에서 6으로 증가시킨다.
-> 컴파일러가 5로 평가되는 임시 복사본 x값을 y에 할당한다.
-> 임시 복사본이 삭제된다.


✔️ 전위 증감 연산자를 사용하는 것이 후위 증감 연산자를 사용하는 것보다 성능이 더 좋다!
-> 후위 증감 연산자로 사용하는 경우, 연산자 우선순위가 가장 나중으로 밀린다.



4. 논리 연산자

: 여러 조건을 테스트할 수 있는 기능을 제공한다.

(1) 논리 부정(Logical NOT)

: 논리 부정 연산자(!)는 부울(bool) 값을 반전시킨다.
-> 피연산자 true를 평가하면 false / false를 평가하면 true

✔️ 우선순위가 매우 높으므로 주의해서 사용해야 한다!

//x==y가 아니라면 "x does not equal y"값이 출력되어야 함
//옳지 못한 방법 -> 출력 값 : x equals y
int x = 5;
int y = 7;
if (! x == y)
    cout << "x does not equal y";
else
    cout << "x equals y";
/
/
//올바른 방법 -> 출력 값 : x does not equal y
int x = 5;
int y = 7;
if (!(x == y))
    cout << "x does not equal y";
else
    cout << "x equals y";

(2) 논리 OR(Logical OR) - 논리합

: 두 조건 중 하나가 참(true)인지 테스트하는 데 사용한다.

(3) 논리 AND(Logical AND) - 논리곱

: 두 조건이 모두 참(true)인지 테스트하는 데 사용한다.



5. sizeof 연산자

: 해당 변수의 크기를 반환한다.



6. 조건부 연산자

: C++의 유일한 삼항 연산자(피연산자가 3개)이므로 삼항 연산자라고도 부른다.

  • ?: 연산자 : if-else 문을 더 간결하게 사용하는 방법 제공 / 우선순위가 매우 낮다.

✔️ 사용 방법

//일반적인 if-else
if (condition)
    expression;
else
    other_expression;

//?: 연산자 사용
(condition) ? expression : other_expression;

✔️ 활용 예시

//if-else
if (x > y)
    larger = x;
else
    larger = y;

//?:
larger = (x > y) ? x : y;

✔️ 출력하는 코드를 짜고 싶다면 <<연산자가 ?:연산자보다 우선순위가 높으므로 ()를 써야한다!

//if-else
f (x > y)
    std::cout << x;
else
    std::cout << y;
//?:
std::cout << ((x > y) ? x : y);


7. 관계 연산자(비교)

: 각 연산자는 부울 값(bool value) true(1) 또는 false(0)를 반환한다.

✔️ 부동 소수점 숫자 비교
-> 부동 소수점 숫자의 반올림 오류 때문에 관계 연산자를 사용해서 비교하는 것은 위험하다.
-> == 또는 !=를 사용하는 것은 권장하지 않는다.



8. 비트 연산자

: 변수 내의 비트(bit)를 조작한다.

  • 최적화가 필요한 특정 상황을 제외하고는 잘 쓰지 않는다.
  • C++에서는 기호가 있는(signed)정수에서 적용 방식을 보장하지 않으므로 부호 없는(unsigned)정수 자료형을 사용해야 한다.

(1) Bitwise left shift / Bitwise right shift

✔️ 왼쪽 시프트 연산자(<<): 각 비트를 왼쪽으로 이동시킨다.

3 = 0011
3 << 1 = 0110 = 6
3 << 2 = 1100 = 12
3 << 3 = 1000 = 8
  • 왼쪽 피연산자 : 이동할 수식
  • 오른쪽 피연사자 : 이동할 비트 정수 수
  • 3 << 1은 리터럴 3의 비트를 왼쪽으로 1자리 이동시킨다.
  • 3 << 3 경우에, 이동한 비트가 왼쪽 끝 범위를 넘어간다. (이진수의 끝에서 벗어난 비트는 손실된다.)

✔️ 오른쪽 시프트 연산자(>>): 각 비트를 오른쪽으로 이동시킨다.

12 = 1100
12 >> 1 = 0110 = 6
12 >> 2 = 0011 = 3
12 >> 3 = 0001 = 1
  • 12 << 3 경우에, 이동한 비트가 오른쪽 끝 범위를 넘어간다. (이진수의 끝에서 벗어난 비트는 손실된다.)

✔️ 변수도 시프트할 수 있다!

unsigned int x = 4;
x = x << 1; // x will be 8

(2) Bitwise NOT

  • 비트 NOT 연산자(~) : 비트 단위 연산자 중 가장 이해하기 쉽다.
    -> 각 비트에서 0과 1을 서로 바꾼다.
    -> 결과값은 자료형의 크기에 따라 다르다.
//4bits
4 = 0100
~4 = 1011 = 11 (decimal)

//8bits
4 = 0000 0100
~4 = 1111 1011 = 251 (decimal)

(3) Bitwise AND, OR, XOR

  • 비트 AND 연산자(&), 비트 OR 연산자(|) : 논리 AND 연산자(&&) 및 논리 OR 연산자(||)와 비슷하게 동작한다.
    -> But, bool 값을 평가하는 대신 각 비트에 적용된다. (비트의 각 열에 연산이 적용된다.)

  • 비트 OR 연산자(|) : 비트 두개 중 하나 이상이 1이면 1로 평가된다.
//5 | 6: 0111(7)
0 1 0 1 // 5
0 1 1 0 // 6
-------
0 1 1 1 // 7
  • 비트 AND 연산자(&) : 두 비트 모두 1인 경우에만 1로 평가된다.
//5 & 6: 0100(4)
0 1 0 1 // 5
0 1 1 0 // 6
--------
0 1 0 0 // 4
  • 비트 XOR 연산자(^) : 두 연산자를 평가할 때, 한 개의 피연산자만 1인 경우에만 1로 평가된다. (같으면 0, 다르면 1)
//5 ^ 6: 0101(5)
0 1 1 0 // 6
0 0 1 1 // 3
-------
0 1 0 1 // 5

  • 활용 코드 (게임 캐릭터의 상태값을 조절할 때 많이 사용함)
#define HUNGRY 1(0x1)
#define THIRSTY 2(0x2)
#define TIRED 4(0x4)
#define FIRE 8(0x8)
#define COLD 16(0x10)
#define POISON 32(0x20)
//이후부터는 (0x40,0x80,0x100,0x200...등)

unsigned int iStatus = 0;

//상태 추가
iStatus |= HUNGRY;
iStatus |= THIRSTY;

//상태 확인
if (iStatus & THIRSTY)
{
}

//특정 자리 비트 제거
iStatus &= ~THIRSTY;

9. 비트 할당 연산자





📌 참고 : 소년코딩 블로그 | https://boycoding.tistory.com/158

0개의 댓글