연산자란 C언어 수식 또는 문장에서 어떤 기능을 수행하는 기호를 의미합니다. 수학 연산에서 배우는 기호와 많이 유사하죠.
예를 들어 다음과 같은 C언어 문장이 있다고 합시다.
int age = 10;
age = age + 10;
첫 문장은 정수형 변수 age를 선언하고 그 변수에 10을 대입하라는 의미입니다. 여기서 '='기호는 오른쪽 값을 왼쪽에 대입(또는 지정Assignment)하라는 대입연산자입니다. age와 10은 피연산자입니다.
두 번째 문장은 위에서 선언한 age(10이란 값이 들어 있죠.)에 10를 더해 다시 age에 넣으라는 의미입니다. '+'기호는 더하라는 의미의 산술(Arithmetic)연산자이고 '='기호는 마찬가지로 대입연산자입니다.
1. 산술연산자
산술연산자는 두개의 피연산자를 갖습니다. 표에 정리한 바와 같이 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/) 사칙연산과 나머지(% : modulus) 연산자가 있습니다. 곱셈과 나눗셈의 경우 수학기호와 다르니 주의하시길 바랍니다.
x % y
이 표현은 x를 y로 나누었을 때의 나머지를 의미하며, 나누어 떨어지면 0이 됩니다. 아래는 연도를 4로 나누어 떨어지고 100으로 나누어 떨어지지 않는 해인 윤년을 판단하는 코드입니다.
if ((year % 4) == 0 && year % 100 != 0) || year % 400) == 0)
printf ("%d is a leap year\n", year);
else
printf ("%d is no a leap year\n", year);
%연산자는 float나 double에는 적용되지 않습니다. 정수의 나눗셈의 경우 나머지는 보통 버려지게 됩니다. 정수형 10/3의 결과는 수학적으로 3.333...이지만 소숫점 아래부분은 버려져서 3이 됩니다.
2. 관계연산자와 논리연산자
관계연산자는 보통 두 값을 비교할 때 사용하는 부등호와 등호를 의미합니다. 왼쪽의 값이 오른쪽 값과 크다(>), 작다(<), 크거나 같다(>=), 작거나 같다(<=)와 같은 부등호와 같다(== : 등호 두개 입니다), 같지 않다 (!=)와 같은 등호가 있습니다.
논리연산자는 두 값이 모두 참인 경우를 판정하는 AND (&& : 논리곱)연산자와 두 값 중 한 값이라도 참인 경우를 판정하는 OR (|| : 논리합) 그리고 참값을 거짓값으로 거짓값을 참값으로 바꾸는 NOT(! : 부정)연산자가 있습니다.
관계연산자와 논리연산자는 다음 포스팅에서 다룰 조건문 (if ~ else), 분기문 (switch ~ case), 순환문(for, while 등)등에서 사용되는 경우가 많습니다.
for (i = 0; i < limit-1 && (c = getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
코드가 조금 복잡해 보입니다. 새로운 문자를 i < limit-1일 때까지 입력을 받아 배열에 저장하는 코드인데, 여기서는 관계연산자와 논리연산자가 이런식으로 사용된다는 정도만 아시면 될 것 같습니다.
3. 증감연산자
증감연산자는 C언어에서 변수의 값을 증가시키거나 감소시키는 연산자 입니다. 증가연산자인 ++는 1을 증가시키고, 감소연산자인 --는 1 감소시킵니다. 증감연산자는 접두사(++n) 또는 접미사(n++)로 쓸수 있는데 ++n의 경우 사용되기 전에 증가시키고 n++은 사용 후 증가시킵니다.
int n = 5;
x = n++;
또는
x = ++n;
위 코드의 n의 값이 처음에 5이고 x = n++; 을 하면 x는 5의 값을 갖고, x = ++n; 하면 x는 6의 값을 갖습니다.
4. 비트연산자
C언어 비트연산자는 비트 AND (&), 비트 inclusive OR(|), 비트 exclusive OR(^), 비트 좌측이동(<<), 비트 우측이동(>>), 보수(~) 등 6개가 있습니다.
비트 AND연산자는 두 값을 비트 단위로 비교하여 둘 중의 한값이라도 0이면 비트 0으로 바꿉니다. 예를 들어 char x=1, y = 2;라고 하면 이진수로 x는 0000 0001이고 y는 0000 0010인데 각자리 비트끼리 비교해 보면 둘다 1이 되는 경우가 없으므로 x&y는 0입니다. 논리연산자와 헷갈리면 안되는데요, 논리연산자인 &&는 둘다 0이외의 값이 있기 때문에 x&&y는 1됩니다.
비트 inclusive OR연산자는 두 값을 비트 단위로 비교하여 둘 중의 한값이라도 1이면 비트 1로 바꿉니다. 비트 AND연산자와 비교해보면 위에서 x|y를 하면 이진수로 0000 0011인 3을 값으로 갖습니다.
비트 exclusive OR연산자는 두 값을 비트 단위로 비교하여 같은 값이면 0으로 다른 값이면 1로 비트를 바꿉니다.
비트 이동연산자 <<와 >>는 왼쪽에 있는 값을 오른쪽 값만큼의 비트 만큼 이동 (shift)하는 연산자입니다.
보수 연산자 ~는 정수의 1의 보수를 의미하며, 값의 비트가 0이면 1로 1이면 0으로 바꿉니다.
5. 대입연산자
대입연산자는 오른쪽의 값을 왼쪽의 변수에 대입(assignment, 지정) 하는 연산자입니다. 기본적인 대입연산자가 있고 다른 산술,비트연산자와 등호를 연결해 다음과 같이 복합대입연산자로도 빈번히 사용합니다.
아래와 같은 수식이 있다고 하면,
i = i + 2;
좌변의 변수를 우변에 한번 더 사용하는데 이를 압축하여 다음과 같이 사용할 수 있습니다.
i += 2;
복합대입연산자를 사용할 때는 왼쪽의 값을 오른쪽 수식 전체에 대한 연산 후 대입한다는 것을 주의하셔야 합니다.
x *= y + 1;
x = x * (y + 1) /* 이 의미입니다. */
x = x * y + 1; /* 이 의미가 아닙니다. */
이외에도 조건 연산자인 ? :, sizeof 등의 연산자가 있습니다.
지금까지 C언어 연산자에 대해 알아봤습니다. 다음 시간에는 조건문에 대해 공부해 보겠습니다. 안녕~
'프로그래밍 > C언어' 카테고리의 다른 글
C언어 공부하기 - 순환문(1) while, for (0) | 2020.07.23 |
---|---|
C언어 공부하기 - 제어문 (1) | 2020.07.21 |
C언어 공부하기 - 변수와 상수 (0) | 2020.07.18 |
C언어 공부하기 - 시작하기 (0) | 2020.07.16 |
C언어 공부하기 - 개요 (0) | 2020.07.14 |
댓글