2007. 3. 17. 09:47

a = 10 + b - 30 + (c + d);
위와 같은 문장이 있을때, = 를 기준으로 l-value(left value), r-value(right value)라 하며 l-value에는 수식이 올수 없으며 항상 변수가 오도록 규정되어져 있다. 여기서 =를 대입연산자라 하며 대입연산자는 l-value와 r-value를 갖는 대표적인 이항연산자이다. 또한 10 + b의 경우도 +는 10과 b라는 두개의 항을 갖는 이항연산자이다.

일항연산자 :    ~    *    ++    --
이항연산자 :    &    |    +    -    *    /    %
                    &&    ||    ==    >>    <<    +=    -=    *=    /=    ~=    &=    |=    >>=    <<=

삼항연산자 : ? :

이들을 다시 사용되는 분류상 나누어 보면 다음과 같다.

비트연산자 : & |
포인터관련연산자 : * &
전행,후행연산자 : ++ --
사칙연산자 : + - * /
나머지연산자 : %
쉬프트연산자 : >> <<
대입연산자 : += -= *= /= ~= &= |= >>= <<=
관계연산자 : && || ~ > < >= <= == !=

2.1 비트연산자

비트연산자는 and(&), or(|)의 비트 연산을 수행한다. 예를 들어 보겠다.

unsigned int a = 510,c;
unsigned int b = 0x0001;

c = a & b;

c에는 어떤 값이 대입될까? 결과는 0이다.

a = 0000 0001 1111 1110
b = 0000 0000 0000 0001

and ------------------

c = 0000 0000 0000 0000

보편적으로 and는 특정 비트의 값만을 추출하기 위해서 or는 특정비트를 1로 셋팅하기 위해서 많이 사용되며 and연산의 경우를 비트마스크라고 한다. 그래픽이나 하드웨어 제어시 사용된다.


2.2 포인트관련연산자

포인터는 C언어를 공부하는 모든 분들이 아주 어려워 하며 이곳에서 적절히 설명할 정도로 내용이 적지 못하다. 뒤에서 하나의 장으로 다시 설명하기로 하고 여기서는 연산자라는 입장에서만 생각해 보기로 하자.

int a = 10;
int *b;
b = &a;

printf("%x,%d,%d ",b,*b,a);

위 예에서 b라는 변수는 포인터변수로 선언되어 졌으므로 주소가 저장되어야 하므로

b = a;

와 같이 사용할수 없다. 값이 아닌 주소의 산출을 위해 &연산자를 사용하며 a라는 한개의 항을 갖는것을 볼수 있다. 간혹 비트연산자(and)와 혼동할수 있는데 항의 수로 구분하기 바란다.

printf()함수를 보면 b와 *b가 구분되어져 있는 것을 볼수 있다. b는 주소를 출력하며 해당 주소에 저장된 값을 보고자 할때는 *연산자를 사용하여 *b와 같이 표기해야 한다.


2.3 전행,후행연산자

전행연산자는 먼저 연산을 수행하여 결과를 저장하며, 후행연산자는 나중에 결과를 저장한다.

int a = 5;
a++;
--a;

a++와 같은 연산자를 후행연산자라고 하고 --a같은 연산자를 전행연산자라고 한다. 이들은 각각 아래와 같이 풀어서 생각해 볼수 있다.

int a = 5;
a = a + 1;
a = a - 1;

자~ 그럼 아래 예의 결과는 어떻게 될까?

int a = 5,b;
b = a++ + --a + ++a;
printf("%d ",b);

+ 연산자 두개를 기분으로 각각의 전행,후행연산자가 사용되었음을 볼수 있다. 항상 연산순위는 항이 낮은 것부터, 왼쪽에서 오른쪽순으로 수행된다. 이러한 기준으로 보면 가장 먼저 수행되는 항은 a++ 이다. 후행연산자 이므로 a는 5이지만 나중에 즉 printf()가 수행된 후에는 수치가 하나 증가하도록 예약되어 진다. 다음으로 --a는 전행연산자이므로 현재 a에 저장된 5란 값을 4로 감소시킨다. 다음으로 ++a는 전행연산자이므로 현재 저장된 4란 값을 1증가 시킨다.
이 값들을 모두 더하면 5 + 4 + 5 = 14가 된다. 그러나 printf()문을 수행하기전에 예약해 두었던 1이 증가하므로 사실상 b에는 15란 값이 저장되게 된다.
사실 위와 같은 예제는 시험에나 등장하는 예일 것이다. 실제로 작성할때는 이렇게 복잡하게 연산자를 사용하지도 않아야 한다. 여기서는 이해를 목적으로 하기에 설명한것 뿐이다.

'STUDY > C 언어' 카테고리의 다른 글

논리연산식의 표현방법  (0) 2007.03.30
연산자 2  (0) 2007.03.17
연산자 1  (0) 2007.03.16
데이터형 구조  (0) 2007.03.16
명령어 이해 - volatile  (0) 2007.03.09
Posted by Paul Hwang