안녕하세요 피터입니다.

오늘은 C언어에서 사용되는 연산자(Operator)에 대해서 알려드리겠습니다. 

연산자란 컴파일러에게 특정한 수학적 or 논리적 동작을 수행하도록 알려주는 기호(Symbol)입니다.  C언어에는 아래와 같은 다양한 연산자들이 제공되고 있습니다. 

연산자의 종류별 설명과 쓰임새에 대해 다루고 각 연산자들이 갖는 우선순위에 대해 설명드리겠습니다.


1. 연산자 종류

1.1. 산술 연산자 (Arithmetic Operator)

가장 익숙한 산술 연산자부터 살펴보겠습니다. 산술 연산자는 말 그대로 수학적인 계산을 하는데 필요한 연산자들입니다. 

C언어에서는 다음과 같이 사칙연산을 포함한 다양한 산술 연산자를 제공합니다. 

예제는 A = 10, B = 20 일때 결과입니다.

 연산자

설명 

 예제

 +

 두 값을 더함.

 A + B = 30 

 -

 좌항의 값에서 우항의 값을 뺌.

 A - B = -10 

 *

 두 값을 곱함. 

 A * B = 200 

 /

 좌항의 값을 우항의 값으로 나눔.

 B / A = 2

 %

 좌항의 값을 우항의 값으로 나눈 나머지 값.

 B % A = 0

 ++

 숫자값을 1만큼 증가.

 A++ (or ++A) = 11

 --

 숫자값을 1만큼 감소. 

 A-- (or --A) = 9


1.2. 관계 연산자 (Relational Operator)

관계 연산자는 비교 연산자라고도 하는데요 수학에서 부등호를 떠올리시면 이해가 빠르실 겁니다.

예제는 A = 10, B = 20 일 때 결과입니다.

 연산자

설명 

 예제

 ==

 좌항의 값과 우항의 값이 같은지 확인.

 (A == B) is False 

 !=

 좌항의 값과 우항의 값이 다른지 확인.

 (A != B) is True

 >

 좌항의 값이 더 큰지 확인.

 (A > B) is False 

 <

 우항의 값이 더 큰지 확인.

 (A < B) is True

 >=

 좌항의 값이 크거나 같은지 확인.

 (A >= B) is False

 <=

 우항의 값이 크거나 같은지 확인.

 (A <= B) is True


1.3. 논리 연산자 (Logical Operator)

논리 연산자는 주로 조건문(if)이나 반복문(while, for) 등에서 여러 개의 조건절을 처리할 때 사용합니다. 

결과는 Boolean 값으로 True 또는 False 값을 가집니다.

예제는 A = 1, B = 0 일 때 결과입니다.

 연산자

설명 

 예제

 &&

 논리곱. 두 값이 모두 True인 경우에만 True.

 (A && B) is False

 ||

 논리합. 두 값중 하나라도 True이면 True.

 (A || B ) is True

 !

 논리부정. 단항연산자이며 반대값을 취함.

 !(A && B) is True


1.4. 비트 연산자 (Bitwise Operator)

비트연산자는 좌항과 우항에 대해서 비트 단위로 처리해서 결과를 계산하도록 하는 연산자입니다. 

주로 옵션을 저장하는 Flag 값을 셋팅할 때나 반대로 Mask를 적용해서 특정 옵션값을 추출할 때 사용합니다. 

비트단위 연산은 처리 속도가 빠른 편이기 때문에 잘 활용할 수 있다면 성능 향상을 기대해볼 수 있습니다. 

예제는 A = 60, B = 13 일 때 결과입니다.

이해를 돕기 위해 2진법으로 표기하였습니다. 

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A = 1100 0011


 연산자

설명 

 예제

 &

 좌항과 우항을 비트 단위로 논리곱 연산을 수행. 결과값은 둘 다 1일 때 1, 나머지 경우는 0이 된다.

 (A & B) = 12, i.e., 0000 1100

 |

 좌항과 우항을 비트 단위로 논리합 연산을 수행. 결과값은 둘 다 0일 때 0, 나머지 경우는 1이 된다.

 (A | B) = 61, i.e., 0011 1101

 ^

 좌항과 우항을 비트 단위로 배타적논리합 연산을 수행. 결과값은 둘 다 0이거나 1이면 0, 두 값이 다르면 1이 된다.

 (A ^ B) = 49, i.e., 0011 0001

 ~

 단항 연산자로 모든 비트를 반전시킨다. 0은 1로 1은 0으로. 비트단위 논리부정. 부호비트가 바뀌기 때문에 음수가 된다. 

 (~A ) = -61, i.e,. 1100 0011

 <<

 비트단위 이동 연산자로 좌항의 값을 우항의 수 만큼 왼쪽으로 이동.

 A << 2 = 240 i.e., 1111 0000

 >>

 비트단위 이동 연산자로 좌항의 값을 우항의 수 만큼 오른쪽으로 이동. 

 A >> 2 = 15 i.e., 0000 1111


아래와 같이 비트 연산자 &, |, ^ 에 대한 결과를 함께 비교해보면 이해가 좀 더 쉽게 되실 겁니다.

 p

 q 

 p & q

 p | q

 p ^ q

0

0

 0

0

0

0

1

 0

1

1

1

1

 1

1

0

1

0

 0

1

1


1.5. 대입 연산자 (Assignment Operator)

대입 연산자는 기본적으로 우항의 값을 좌항에 대입할 때 사용합니다. 

다음과 같이 산술 연산자나 비트 연산자 등과 결합하여 축약형으로 사용할 수 있습니다.

 연산자

설명 

 예제

 =

 우항의 값을 좌항으로 대입.

 C = A + B

 +=

 좌항의 값에 우항을 더한 값을 좌항에 대입.

 C += A is C = C + A

-=

 좌항의 값에서 우항을 뺀 값을 좌항에 대입. 

 C -= A is C = C - A

 *=

 좌항의 값과 우항의 값을 곱한 값을 좌항에 대입.

 C *= A is C = C * A

 /=

 좌항의 값에서 우항의 값을 나눈 값을 좌항에 대입.

 C /= A is C = C / A

 %=

 좌항의 값을 우항으로 나눈 나머지 값을 좌항에 대입.

 C %= A is C = C % A

 <<=

 좌항의 값을 우항의 수만큼 왼쪽으로 비트 단위 이동을 한 값을 좌항에 대입.

 C <<= 2 is C = C << 2

 >>=

 좌항의 값을 우항의 수만큼 오른쪽으로 비트 단위 이동을 한 값을 좌항에 대입.

 C >>= 2 is C = C >> 2

 &=

 좌항의 값과 우항을 비트 단위 논리곱한 값을 좌항에 대입.

 C &= 2 is C = C & 2

 ^=

 좌항의 값과 우항을 비트 단위 배타적논리합한 값을 좌항에 대입.

 C ^= 2 is C= C ^ 2

 |=

 좌항의 값과 우항을 비트 단위 논리합한 값을 좌항에 대입.

 C |= 2 is C = C | 2


1.6. 기타 연산자 (ETC Operator)

위에서 설명한 연산자들 외에도 C언어에서 자주 사용되는 중요한 연산자가 있습니다. 

앞으로 배우게 될 중요한 개념중 하나인 포인터 관련 연산은 굉장히 자주 사용되고 중요합니다. 

sizeof()같은 경우 자료형이나 변수, 구조체의 크기를 구할 때 자주 사용됩니다. 

 연산자

설명 

 예제

 sizeof()

 괄호 안에 주어진 변수 또는 자료형의 크기를 반환.

 sizeof(int) is return 4

 &

 단항연산자로 변수의 주소값을 반환.

 &a is 변수 a의 주소값 반환

 *

 포인터의 값을 반환.

 *p is 포인터변수 p의 값 반환

 ? :

 조건 연산자. 조건에 따라 두 값중 하나를 반환. (조건절)? A : B 에서 조건절이 True이면 A조건절이 False이면 B 반환

 (A<0) A is A가 0보다 작으면 0, 크면 A를 반환


2. 연산자 우선순위

C언어에서 사용되는 모든 연산자에는 우선순위가 있습니다. 

예를 들어 x = 7 + 3 * 2; 과 같이 여러 연산자가 연달아서 사용된 문장의 경우 연산자 우선순위에 따라 + 보다 * 이 우선시되므로 결과값이 20이 아니라 13이 됩니다. 

아래 표에서 상위에 위치한 연산자일 수록 우선순위가 높고 맨 아래 위치한 연산자가 가장 우선순위가 낮습니다.

 분류

연산자 

결합법칙

 후위(Postfix)

 () [] -> . ++ --

 왼쪽에서 오른쪽

 단항(Unary)

 + - ! ~ ++ -- (type)* & sizeof

 오른쪽에서 왼쪽

 곱셈(Mutiplicative)

 * / %

 왼쪽에서 오른쪽

 덧셈(Additive)

 + - 

 왼쪽에서 오른쪽

 비트이동(Shift)

 << >>

 왼쪽에서 오른쪽

 관계(Relational)

 < <= > >=

 왼쪽에서 오른쪽

 균등(Equality)

 == !=

 왼쪽에서 오른쪽

 비트곱(BitwiseAND)

 &

 왼쪽에서 오른쪽

 비트배타합(BitwiseXOR)

 ^

 왼쪽에서 오른쪽

 비트합(BitwiseOR)

 |

 왼쪽에서 오른쪽

 논리곱(LogicalAND)

 &&

 왼쪽에서 오른쪽

 논리합(LogicalOR)

 ||

 왼쪽에서 오른쪽

 조건(Conditional)

 ?:

 오른쪽에서 왼쪽

 대입(Assignment)

 = += -= *= /= %=>>= <<= &= ^= |=

 오른쪽에서 왼쪽

 콤마(Comma)

 ,

 왼쪽에서 오른쪽



여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

-Peter의 우아한 프로그래밍

블로그 이미지

Awesome PeterAhn

IT 정보 공유, 프로그래밍 지식 공유, 훌륭한 개발자가 되어보자