05. 연산자

연산자의 종류

기능별 종류 연산자
산술 연산자 + _ * / %
부호 연산자 + –
대입 연산자 = 복합 대입 연산자
관계 연산자 == != <= < >= >
증감 연산자 ++ —
포인터 연산자 * & []
구조체 연산자 . ->
논리 연산자 || && !
비트 연산자 ! & ~ >> <<
삼항 조건 연산자 ? :
쉼표 연산자 ,
sizeof 연산자 sizeof
캐스트 연산자 (type) type()
괄호 연산자 ()
C++ 연산자 new delete :: .* ->*

연산자의 우선 순위

순위 연산자 결합순서
1 () [] -> 왼쪽 우선
2 ! ~ ++ — + – (부호) * (포인터) & sizeof 캐스트 오른쪽 우선
3 *(곱셈) / % 왼쪽 우선
4 + – (덧셈, 뺄셈) 왼쪽 우선
5 << >> 왼쪽 우선
6 < <= > >= 왼쪽 우선
7 == != 왼쪽 우선
8 & 왼쪽 우선
9 ^ 왼쪽 우선
10 | 왼쪽 우선
11 && 왼쪽 우선
12 || 왼쪽 우선
13 ? : 오른쪽 우선
14 = 복합대입 오른쪽 우선
15 . 왼쪽 우선

연산자의 기능

산술 연산자

+ – * /

일반적인 사칙연산과 동일하게 덧셈, 뺼셈, 곱셈, 나눗셈을 수행한다. 각 셈에서 결과값은 타입을 벗어날 수 없음에 주의해야 한다.

%

나머지를 구하는 연산자.

대입 연산자

Assignment. 변수에 어떤 값을 집어넣는 동작. 우변에는 값을 구할 수 있는 식이라면 무엇이 와도 상관 없으나 좌변에는 좌변값만이 와야 한다. 대입 연산은 대입된 값을 리턴하므로 a=b=c=4등의 식도 성립 가능하다.

복합 대입 연산자

+, -, *, /, %, &, |, ^, <<, >>의 연산자 뒤에 결합해 좌변값을 대상으로 우변값을 연산하고 그 값을 좌변값에 바로 대입하도록 하는 식은 자주 활용된다.

증감 연산자

피연산자를 1씩 증가시키거나 감소시킨다.

전위형

증감 연산자가 피연산자 앞에 위치하고, 값을 먼저 증감시킨 후 그 결과를 리턴한다.

후위형

증감 연산자가 피연산자 뒤에 위치하고, 값을 먼저 리턴한 후 그 값을 증감시킨다.

주의점

피연산된 값은 상수이므로 증감연산자를 중복해 사용할 수 없다. 또한 한 식에서 여러번 사용할 때는 미리 값의 변화를 시험하고 사용하는 것이 좋다. 예로

printf(%d,%d\n",i,++i);

C는 함수의 인수를 뒤에서부터 순서대로 전달하므로 ++i가 먼저 수행된다. 그러나 인수 전달 순서는 지정되어 있지 않으므로 컴파일러마다 결과가 상이할 수 있다. 또한 가독성을 떨어뜨리므로 많이 사용하는 것은 자제해야 한다.

관계 연산자

수학에서와 같으며, ==는 동일한지, !=는 동일하지 않은지에 대해 0또는 1을 리턴한다. 논리값은 0은 거짓 그 외의 값은 모두 참으로 여긴다.

상등 연산자의 사용

==를 사용할때는 오타로 인한 버그를 줄이기 위해 상수를 좌변에 써주는 것이 좋다.

논리 연산자

  • ! : 논리식의 값을 반대로 만든다.
  • && : 두 식이 모두 참일때만 참이다.
  • || : 두 식이 모두 거짓일때만 거짓이다.

&&과 ||의 경우, 좌측에서부터 시작해 논리값이 정해진다면 그 이후는 수행하지 않는다.

비트 연산자

  • ~ : 비트를 반전시킨다
  • & : 같은 자리의 두 비트가 모두 1이면 1이 된다.
  • | :같은 자리의 두 비트가 모두 0이면 0이 된다.
  • ^ : 같은 자리의 두 비트가 달라야 1이 된다.
  • << : 지정한 수만큼 왼쪽으로 비트를 이동한다.
  • >> : 지정한 수만큼 오른쪽으로 비트를 이동한다.

&의 활용

비트마스크에서 해당되는 부분만 1로 하고 연산을 수행해, 그 값을 추출할 수 있다.

^의 활용

XOR로, 같은 값에 재연산을 하면 원래대로 돌아오는 특성 덕에 기초적인 암호화나 이미지의 이동, 반복적인 점멸 처리등에 사용한다.

쉬프트 연산자

빈 자리는 0으로 채워진다. 고속의 그래픽 처리가 필요할 때 사용된다. 주로 부호없는 정수형을 대상으로 하며 실수형은 안된다. 부호있는 정수형은 동작이 달라지므로 권장하지 않는다.

2^n이 되는 것을 이용하여 조합을 이용해 곱셈을 수행한다. CPU는 가산기이므로 곱셈과 나눗셈은 비용이 높은 계산식이므로 더 경제적이다. (나머지 연산자는 더 비용이 높다.)

회전 연산

연산자 형태로는 제공되지 않고, 함수 형태로 제공된다. 쉬프트 연산자와 유사하게 _rotl은 왼쪽으로, _rotr은 오른쪽으로 쉬프트하나 공백을 소실되는 비트로 채워넣는다.

rotl(bitmask, bitToRotate),rotr(bitmask, bitToRotate)

삼항 조건 연산자

매우 간단한 if 구문 대체자. 가동성을 위해 조건식에는 괄호를 사용하는 것을 권장한다.

조건식 ? 참일 경우 리턴 : 거짓일 경우 리턴

쉼표 연산자

좌변을 먼저 평가하고 우변을 평가한 후 우변의 연산 결과를 리턴한다.

{ }

의 도움 없이 두개 이상의 문장을 하나로 묶어야 할 때와 for문에서 제어 변수 두 개를 사용하고자 할때 중요하게 쓰인다.

sizeof 연산자

단순한 변수나 배열까지는 왜쓰나 싶지만, 구조체와 같은 경우나 소스 수정이 이어졌을때 크기가 변할 수 있는 경우에 매우 유용하게 쓰인다.

컴파일 시에 컴파일러에 의해 계산되며 그 결과는 정수 상수이다. 타입이나 변수의 크기는 컴파일할 때 미리 알 수 있기 때문에 컴파일러가 컴파일할 때 계산해서 결과 상수를 대신 집어 넣는다. (실행 시간에 계산되지 않는다.)

캐스트 연산자

수식 내에서 변수의 타입을 강제로 다른 타입으로 바꾼다. 수식 내에서 변수의 타입을 임시로 바꾸는 것이지 변수의 타입 자체를 바꾸는 것은 아니다.

  • C style casting : (type) variable
  • C++ style casting : type (variable)

Leave a Reply