본문 바로가기
프로그래밍/C || CPP

[C/C++] 연산자 정리

by _BlankSpace 2017. 5. 28.

  0. 서론

이번 포스팅은 프로그래밍에 있어서 기본이 되는 연산자에 대해서 정리하고자 합니다.

연산자는 굉장히 간단합니다. 몇 가지 되지 않을 뿐더러 금방 이해할 수 있는 개념이라고 할 수 있습니다.

하지만, 이항 연산자에서 비트 단위로 계산하는 개념은 모르시는 분들이 많습니다. 요즘 같이 충분한 메모리와 용량이라면, 굳이 비트 수준으로 프로그래밍 할 필요가 있을까라는 생각을 하시는 분들이 보통 비트 연산자에 대해서 소홀하신 편인 것 같습니다. 하지만, 임베디드에서 iot까지.. row 수준으로 갈수록 비트 하나하나가 중요하다는 것을 요즘 들어서 저에게는 소중하다고 깨닫게 하는 것 같습니다.


어찌되었든, 알아서 나쁜 것은 없지 않을까요? 오늘 확실하게 정리하시는 것 어떨가 싶습니다.


  1. 1순위 연산자 정리

() : 수식의 우선순위을 변경합니다.

[] : 배열을 선언하거나 배열 요소를 지정합니다.

. : 구조체 및 공용체의 멤버를 참조할 때 사용하는 연산자입니다.

-> : 구조체 및 공용체의 간접멤버를 참조할 때 사용하는 연산자입니다.


 2.  단항연산자


 - : 부호를 반전시킵니다.

+ : 부호를 유지시킵니다.


! : 논리부정 ( 0 = False, 1 = True)

ex) a = 3 > 5;    // a에는 0, 즉 False 값이 들어갑니다.

     a = !(3 > 5);    // False 값을 부정하였으므로, a 에는 True 값이 들어갑니다.


++ : 1을 증가시키는 연산자 입니다.

-- : 1을 감소시키는 연산자 입니다.


++, -- 연산자는 전위형과 후위형으로 사용법이 나뉘어 집니다. 이러한 사용법은 다음의 예제로 설명하겠습니다.


OperatorEx1.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main(void)
{
    int a = 0, b = 0;
    a++, b++;
    printf("a = %d, b = %d\n", a, b);
    ++a, ++b;
    printf("a = %d, b = %d\n", a, b);
    printf("a = %d, b = %d\n"++a, ++b);
    printf("a = %d, b = %d\n", a++, b++);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}
cs

결과 :

 >> a = 1, b = 1 

 >> a = 2, b = 2

 >> a = 3, b = 3 // ++ 연산자가 변수 앞에 붙었으므로, 출력하기 전에 변수 값이 1씩 증가합니다.

 >> a = 3, b = 3 // ++ 연산자가 변수 뒤에 붙었으므로, 출력 후에 값이 1씩 증가합니다.

 >> a = 4, b = 4 // 값이 뒤늦게 증가한 것을 확인할 수 있습니다.



~ : 1의 보수 연산자입니다. 비트 값을 1은 0으로, 0은 1로 바꾸어주는 연산자입니다.


(type) : cast 연산자입니다. 자료형의 형변환을 명시적으로 변환하고자 할 때, 사용하는 연산자입니다.

    자동형변환의 방식은 다음과 같습니다.

    - 작은 자료형이 큰 자료형으로 변환됩니다. ex) 

    - 대입이 이루어지는 곳에서의 형변환으로는 오른쪽의 자료형이 왼쪽의 자료형으로 변환되어 대입됩니다.

    - 주소인 데이터 자료형에서는 자동 형변환이 이루어지지 않습니다.


& : 주소를 나타내고자 할 때 사용하는 연산자 입니다.


* : 포인터 연산자입니다. 

    - 선언문에서 사용할 때 : 포인터 변수를 선언할 때 사용합니다.

    - 실행문에서 사용할 때 : 포인터 변수를 가리키는 대상을 의미합니다.

ex) int* a = 5;    // 포인터 변수를 선언한 것입니다.

     printf("%d", *a);    // 실행문에서 포인터 변수인 a를 참조하고자 *연산자를 사용한 것입니다.


sizeof : 변수, 상수 또는 데이터형의 크기를 bytes 수로 계산할 수 있는 연산자입니다.


 3. 이항연산자 

<<, >> : 쉬포트 (shift) 연산자입니다. 오른쪽 또는 왼쪽으로 bit단위로 데이터를 이동시키는 연산자 입니다.


shift 이동을 할 때, 공백을 메우는 법칙은 다음과 같습니다.


<< 

signed 

0으로 채워집니다.

unsigned

 >>

signed 

sign bit의 값으로 채워집니다.

unsigned

0으로 채워집니다. 


% : 나머지 연산자입니다. 몫을 구할 때는 '/' 연산자를 이용하고, 나머지는 '%'연산자를 이용하여 계산합니다.


<, >, <=, >= : 왼쪽과 오른쪽의 값을 비교하는 연산자 입니다. 

ex) 5 > 3 : true


==, != : 서로 같은 지,  아닌 지를 비교하는 연산자 입니다.


--bit 단위로 계산할 때 사용하는 연산자. --

& : AND

| : OR

^ : XOR


 x

x & y 

x | y 

x ^ y 

 0

0

 0

 1

 1


&& : 논리곱

|| : 논리합


x && y 

x || y 

 F

 F

 T

 T


 4. 삼항연산자 

말 그대로 3개의 항으로 이루어진 식이라고 생각하면 되겠습니다.


? : 조건 연산자라고 합니다.

이 부분은 예제로 설명하는 것이 이해가 빠를 것으로 생각하여, 다음 예제로 설명을 하겠습니다.


tripleOperatorEx.cpp

1
2
3
4
5
6
7
#include <stdio.h>
int main(void)
{
    int a = 3 , b = 5;
    (a > b) ? printf("%d > %d \n", a, b) : (a < b) ? printf("%d < %d \n", a, b) \
printf"%d == %d\n", a, b);
    return 0;
}
cs


결과:

 >> 3 < 5  

(a > b) ? printf("%d > %d \n", a, b) : (a < b) ? printf("%d < %d \n", a, b) : printf( "%d == %d\n", a, b);

이 라인과 같이 이루어진 것을 삼항연산자라고 할 수 있습니다.

삼항연산자의 식은 다음과 같습니다.

(조건식) ? (True 식) : (False) 식

삼항연산자는 조건식을 확인합니다. 확인 후, 조건식이 True값이면 True 식으로 이동하며, False 값일 경우에는 False 식으로 이동합니다.

예를 들어볼까요.

(13 == 15) ? printf("Hi"); : printf("Hello");

답은 어떤 것일까요.

먼저, 조건식을 보겠습니다. 13과 15는 같지 않으므로, False 값이 나올 것입니다. 그럼 후위 식을 출력하겠죠?

그러므로 답은 Hello가 출력될 것입니다.

이러한 것처럼 위의 식도 확인해보겠습니다.

(a > b) ? printf("%d > %d \n", a, b) : (a < b) ? printf("%d < %d \n", a, b) : printf( "%d == %d\n", a, b);

제 나름대로 이해하기 쉽도록 나누어 봤습니다.

먼저, (a > b) 값은 조건식이 되겠습니다.

조건식의 True 식은 printf("%d > %d \n", a, b)

조건식의 False 식은 (a < b) ? printf("%d < %d \n", a, b) : printf( "%d == %d\n", a, b);

하지만 False식에 조건이 또 있습니다. (a < b)

(a < b) 조건식의 True 식은 printf("%d < %d \n", a, b)

(a < b) 조건식의 False 식은 printf( "%d == %d\n", a, b);

이렇게 나누어보니, 훨씬 이해하시기 쉬우실 것입니다. 그러므로 삼항연산자를 사용한 곳이 있다면, 당황해 하지마시고 차근차근 해석해 나가시길 바랍니다.

이상 연산자 정리를 마치겠습니다. 글을 읽어 주셔서 감사합니다.


제 글이 도움이 되셨거나 공감이 되시는 부분이 있으셨다면, 밑에 있는 공감 버튼 한 번씩 꾸욱 눌러주시면 감사하겠습니다.


공감 버튼은 저에게 큰 도움이 됩니다. 감사합니다.


댓글