본문 바로가기

개발 공부/C++

따라하며 배우는 C++ 3. 연산자들

따라하며 배우는 C++ 

 

3. 연산자들

 

 

3.1 연산자 우선순위와 결합 법칙

 

연산자에 따라 우선순위가 다르고, 결합 방향이 달라질 수 있다. (Left to right, right to left)

(^ 기호는 caret 캐럿이라고 많이 읽는다. C언어에선 제곱이 아니라 Bitwise XOR이다)

 

3.2 산술 연산자 arithmetic operators

 

단항 연산자 -, +

이항 연산자 *(곱하기) /(나누기) + - %(나머지 연산자)

         ex) z = x%y일 경우 0

여기서 /를 할 때, 하나만 float이면 실수형으로 결과가 나온다.

 

* 여기서 음수를 나누기에서 사용할 경우

정수일 경우 버리는 쪽으로 11버전부터 정해졌다고 한다.

-5 / 2 = -2

나머지 연산의 경우 왼쪽 숫자의 부호를 따라간다.

-5 % 2 = -1

5 % (-2) = 1

 

z += y; //z = z + y;

z -= y; //z = z - y;

% * /도 적용 가능

 

3.3 증감 연산자 increment decrement operators

 

전위 연산자와 후위 연산자의 실행 방식이 다르다.

왼쪽에 붙은 경우, 먼저 증가/감소하고 나서 대입이 된다.

오른쪽에 붙은 경우, 먼저 대입되고 나서 후에 증가/감소한다.

 

다만 위 연산자의 경우, 다소 불분명할 수 있으므로 불명확하게는 쓰지 않는게 좋을 것이다.

 

3.4 sizeof, 쉼표 연산자, 조건부 연산자

 

 

, 연산자는 두 개의 연산이 연달아 있는 경우, 뒤에 것을 변수에 대입한다. 앞의 연산도 물론 연산된다.

 

int a = 1, b = 10; //선언부에서는 구분해주는 기호일 뿐

z = a, b; //여기의 경우 , operator로 작동함.

           여기서는 z=a부터 도입되므로 z값은 a값이 된다.

z = (a, b); 라고 해야 b가 z에 대입된다.

 

 

if 문을 const로 하고자 할 때 삼항 연산자를 쓰면 편리하다!

const price = getPrice(onSale); 

함수로 따로 파서 const를 쓸 수 있다.

예전에는 return하는 경우 메모리를 많이 잡아먹었지만 요샌 괜찮다.

그렇지만 conditional operator를 쓰는 경우가 좀 더 편리하다.

 

3.5 관계 연산자 Relational Operators

 

d1과 d2는 부동 소수점 영역에서 달라질 수 있다.

d1과 d2는 정말 미세한 차이가 남

 

이렇게 일정 크기의 작은 숫자(epsilon)로 대충 오차 범위를 무시하도록 설정할 수 있다.

 

3.6 논리 연산자 logical operators

 

 

여기서 y는 2가 출력된다.

&& operator 입장에서는 둘 중에 하나만 false면 false이므로 왼쪽이 false이면 오른쪽은 계산을 안 하고 넘어간다.

그러므로 y쪽의 increment operator가 작동하지 않는 것이다.

 

위는 XOR 연산이다.

C++에서는 따로 XOR 연산이 없으므로 (값1)!=(값2) 형식을 이용하면 좋다.

예제문제

 

여기의 결과는 r1 = 0(false), r2 = 1(true).

logical AND가 logical OR보다 우선순위가 높다. 그러므로 r1의 경우 r1 = v1|| (v2&&v3)인 것처럼 연산이 된다.

좋은 코딩 방법은 명확히 알 수 있도록 최대한 괄호를 치는 것이다.

 

 

3.7 이진수 Binary Numbers

 

음의 정수 표현하기)

-5라는 이진수가 있을 때, 우선 숫자 5만 이진수로 바꾼다

0000 0101

보수를 취한다(Complement) (0을 1로, 1을 0으로)

1111 1010

1을 더한다

1111 1011

 

3.8 비트단위 연산자 Bitwise Operators

 

비트 단위 연산자를 사용하면 속도가 빠르다. 또한 여러가지 변수형에서 메모리가 남는 경우 이를 사용하기도 했다.

 

 

 

 

left shift는 0과 1의 패턴을 통째로 왼쪽으로 밀고, 오른쪽에 비어 있는 부분은 0으로 채운다.

left shift는 2로 곱하기 된 수가 나온다.

right shift는 2로 나눗셈 된 수가 나온다. 

비트 연산은 내부에 저장된 방식으로 비트를 밀어버리기 때문에 처리 속도가 빠르다.

 

* !a는 logical not이다. bitwise not은 ~a.

 

bitwise not은 1을 0으로, 0으로 1로 바꾼다.

 

비트와이즈 연산도 줄여쓰는 형태 가능

a &= b; 처럼

 

 

3.9 비트 플래그, 비트 마스크 사용법 Bit flags, Bit mask

 

 

 

 

 

bitwise 연산으로 여러 개의 아이템을 갖고 있다는 표시를 짧게 만들 수 있다.

 

 

 

 

위에서 컬러 테이블 보기 가능.

컬러는 #FFD700로 표현을 많이 사용한다. RRGGBB에서 a까지 더해 보통 4바이트로 컬러를 표시한다.(색깔 당 1바이트)

0~255까지의 색깔 정도를 1바이트로 표시하는 것.

 

 

bitmask 연산을 통해 R, G, B 자리의 색깔을 추출할 수 있다.