Qaupot Blog
Software Engineering, Trip

205. 연산자 및 우선순위

🕐 Mon, 03 Feb 2014 09:00:00 GMT 🕓 Fri, 20 Aug 2021 10:44:00 GMT

연산자의 정의

연산자는 메모리 혹은 레지스터 내의 데이터들을 가공하기 위해 C/C++ 에서 제공하는 기본적인 키워드들입니다.

우리가 연산자라고 했을때 떠올리기 쉬운 단순한 사칙연산 기호(+ , - 등)부터
sizeof, new, delete 같은 키워드들도 연산자의 범주에 속합니다.

쉬운 이해를 위해서, 연산자는 함수의 일종으로 생각할 수 있으며, 객체지향언어에서는 함수로 취급되는 경우가 많습니다.

예를 들어 +연산자를 쓴다면 A + B같은 식으로 표현하고, 함수로 풀어보면, 아래와 같습니다.

int operator +(int A,int B)
{
	return A+B;
}

연산자의 우선순위

위는 연산자를 일반적으로 분류하는 방법인 기능 및 우선순위에 따라 나눈 표입니다. 모든 연산자에는 우선순위가 존재합니다.

  • 우선할 연산자를 지정해 두어 문법의 애매모호함을 제거합니다.
  • 각 C 컴파일러별로 같은 코드를 서로 다르게 컴파일 해버리는 경우가 없도록 규정화 합니다.
2 \* 1 + 1
  • * 의 우선순위가 높다면 컴파일러는 (2*1) + 1로 이를 인지하고, 실행시 결과는 3이 됩니다.
  • +의 우선순위가 높다면 2 * (1 + 1)로 인지하고, 결과는 4가 됩니다.

연산자의 종류

연산자는 단항 연산, 이항 연산, 삼항 연산으로 나뉩니다.
이름에서 나타나듯이 단항은 항이 하나, 이항은 항이 둘, 삼항은 항이 셋이 필요한 연산입니다.

연산자의 종류 (단항) - 부호 연산자

일반적으로 의미하는 음수와 양수의 부호를 의미합니다.
+100 이나 -100같이 상수 앞에 붙은 부호가 해당합니다.

연산자의 종류 (단항) - 증감 연산자

++ 나 --가 해당하며, 1을 더하거나 빼는 연산자입니다.

  • A++, ++A
  • A--, --A

실질적 계산은 A = A + 1 이나 A = A - 1과 같습니다.
이 연산자는 변수의 앞이나 뒤에 붙을 수 있으며, 우선순위를 뜻합니다.

int val = 10;
int result;
result = ++val;

위와 같이 변수의 앞에 붙는 형태를 전위 증감연산자라고 하며, = 대입연산자보다 우선순위가 높습니다.

따라서 위의 식은 ++val 을 먼저 처리한 후 그 결과를 result 에 대입합니다.
result 는 11이 대입되며, val 역시 11이 됩니다.

int val = 10;
int result;
result = val++;

위와 같이 변수의 뒤에 붙는 형태를 후위 증감연산자라고 하며, = 대입연산자보다 우선순위가 낮습니다.

따라서 위의 식은 result = var 을 먼저 처리한 후 val 을 증가시킵니다.
result 는 10이 대입되며, val 도 11이 됩니다.

연산자의 종류 (이항) - 산술 연산자

일반적으로 이야기 하는 사칙연산입니다. + - * / %가 이에 해당합니다.

int val = 10;
val = 1 + 2;
val = 1 - 2;
val = 2 / 2;
val = 3 % 2;
  • A + B (더하기)
  • A - B (빼기)
  • A * B (곱하기),
  • A / B (나누기),
  • A % B (A를 B로 나눈 나머지)

연산자의 종류 (이항) - 대입 연산자

A=B에 해당합니다. 우변의 값을 좌변에 대입합니다.

int val = 10;

연산자의 종류 (이항) - 비교 연산자

== != <= < >= >에 해당합니다. 두 값을 서로 비교하고 그에 대한 논리값을 돌려줍니다.

논리 값이라고 함은, true 와 false 를 이야기하며 이는 C 에서는 false 는 0, true 는 0 이외의 값을 의미합니다.

  • C++ 에서는 bool 이라는 데이터형이 존재하며 true 와 false 라는 키워드를 사용합니다. 값은 C와 같습니다.

이 연산자는 조건문에서 주로 이용됩니다.

int val = 10;
if (val == 10) // val가 10이면?
{  
}

if (val < 10) // val가 10보다 작으면?
{  
}

연산자의 종류 (단항, 이항) - 비트 연산자

| & ^ ~ >> <<가 해당합니다.

  • |는 OR
  • &는 AND
  • ^는 XOR
  • ~는 NOT
  • >>와 <<는 SHIFT

char val=0x0F;
val = val | 0x1F;

OR 의 경우, 둘 중 하나의 bit 가 1이면 결과는 1이 됩니다.
00001111
00011111
------
111100의 결과값을 얻게 됩니다.


char val=0x0F;
val = val & 0x1F;

AND 의 경우, 둘 다 bit 가 1이면 결과가 1이 됩니다.
00001111
00011111
------
00001111의 결과값을 얻게 됩니다.


char val=0x0F;
val = val ^ 0x1F;

XOR 의 경우, 둘 개의 비트가 서로 다르면 1이 됩니다.
00001111
00011111
------
00010000 결과값을 얻게 됩니다.


char val=0x0F;
val = ~val;

NOT 의 경우, bit 가 1이면 0, 0이면 1이 됩니다.
00001111
------
11110000 결과값을 얻게 됩니다.


SHIFT 의 경우, 해당 bit 만큼 값을 데이터를 밀어 내며, <<는 좌측으로, >>는 우측으로 밀어낸다는 의미입니다.

  • Value << bit 수
  • 예) 4 << 2
char val=0x0F;
val = val << 2;

00001111
------
00111100 결과 값을 얻게 됩니다.

char val=0x0F;
val = val >> 2;

00001111
------
00000011 결과값을 얻게 됩니다.

처리 단위가 bit(2진수)이므로, 10 진수로 보면 한번 밀어 낼 때 마다 2배 혹은 절반의 값이 됩니다.

  • 4를 좌측으로 2번 밀면 이진법상 2의 승수로 움직이게 되므로 4 * 2 * 2에 해당하여 16의 값이 됩니다.

연산자의 종류 (이항) - 복합대입 연산자

+= -= *= /= %= <<= >>= &= |= ^=에 해당합니다.
대입 연산자에 추가로 다른 연산자가 따라붙은 형태입니다.

int val = 10;
val += 1;
val -= 1;
val \*= 2;
val /= 2;

+= 의 경우 A += B이며 A에 B를 더하여 대입한다는 의미와 같습니다. 이는 A = A + B와 동일합니다.

연산자의 종류 (단항, 이항) - 논리 연산자

|| && !에 해당하고, 논리 값에 대한 처리를 합니다.

  • ||는 OR
  • &&는 AND,
  • !는 NOT

OR 은 둘 중 하나라도 true 이면 true 를 반환하며, AND 는 둘 다 true 여야 true 를 반환합니다.
NOT 은 true 일 경우 false 를, false 일 경우 true 를 돌려줍니다.

int val = 10;
if( (val == 10) && (val != 10) )
{
}

if( (val == 10) || !(val != 10) )
{
}

첫번째 if 문은 val==10의 비교결과로 true 를 얻고, val!=10의 비교결과로 false 를 얻습니다.

  • true 와 false 의 and 는 false 입니다.

두번째 if 문은 val==10의 비교결과로 true 를 얻고, (val!=10)의 비교결과로 false 를 얻은뒤 이를 not 하여 true 를 얻습니다.

  • true 와 true 의 or는 true 입니다.

연산자의 종류 (삼항) - 조건 연산자

?:에 해당하며, (condition) ? val1:val2;의 식을 가집니다.
condition 이 true 라면 val1을 , false 라면 val2를 택하게 됩니다.

int result;
int val1 = 10;
int val2 = 20;

result = (val1 > val2) ? val1 : val2;

조건의 비교 결과로 val2가 val1보다 크므로, false 가 되어 val2를 result 에 대입하게 됩니다.

연산자의 종류 - 그 외 연산자

이 장에서 한번에 이해하기는 어려우므로, 다른 장들에서 별도로 설명할 것입니다.

연산자의 우선순위에 관해

연산자들의 우선순위는 프로그램 작성에서 실수를 유발할 수 있는 부분입니다.
따라서 우선순위에 의해 자동적으로 이루어지는 형태보다는, 괄호를 명시적으로 사용하는 것이 코드의 가독성에 유리하다고 생각됩니다.

  • 습관과 취향의 문제로, 정답은 없습니다.

A = B + 2 * 3; 이라면, A = B + (2 * 3)의 형태로 직접 우선순위를 표기해 주는것이 추후 실수를 줄일 수 있을 것입니다.

  • 괄호가 많아지면 그 역시 가독성을 떨어 뜨릴 수 있으나, 최근에는 개발 도구들이 괄호에 색상을 입혀 가독성을 높여줍니다.
이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.