제 10강) 연산자 이야기 |
오늘은 연산자에 대해서 알아보겠습니다.
연산자(Operator) |
자료를 계산하고 처리(연산)할 때 쓰인다. |
피연산자(Operator) |
연산자에 의해 계산을 당하는 수치 |
위의 두 용어는 알아두셔야 합니다.
result = num + num2; 연산자 : =, + 피연산자 : result, num, num2 |
1) 산술연산자 |
기본적인 사칙연산을 포함하고 있는 산술연산자는 "산술"에 사용됩니다.
연산자 | 연산자의 기능 |
a = b | 대입연산자라고도 불리며 b의 값을 a에 대입한다. |
a + b | 두 피연산자의 값을 더한다. |
a - b | 두 피연산자의 값을 뺀다. |
+a | 단항 덧셈이라 불리며 정수 승급을 한다.(그냥 a와 같다) |
-a | 단항 뺄셈이라 불리며 반수(음수 값화)가 된다. |
a * b | 두 피연산자의 값을 곱한다. |
a / b | 두 피연산자의 값을 나눈다. |
a % b | 두 피연산자를 나눈값의 나머지를 구한다. |
++a | 전위증가라고 불리며 값을 계산하기 전에 값을 1 올린다. |
a++ | 후위증가라고 불리며 값을 계산 후 값을 1 올린다. |
--a | 전위감소라고 불리며 값을 계산하기 전에 값을 1 줄인다. |
a-- | 후위감소라고 불리며 값을 계산 후 값을 1 줄인다. |
(표의 출처 : 위키백과)
그럼 예제를 통해서 하나하나 확인하여봅시다.
#include <stdio.h>
int main(void)
{
int a = 21, b = -5, c;
printf("a = %d, b = %d \n", a, b);
c = a;
printf("c = %d(a) \n", c);
c = a + b;
printf("c = %d(a + b) \n", c);
c = a - b;
printf("c = %d(a - b) \n", c);
c = +b;
printf("c = %d(+b) \n", c);
c = -b;
printf("c = %d(-b) \n", c);
c = a * b;
printf("c = %d(a * b) \n", c);
// 소수를 출력하기 위해서 c에 대입하지 않고 "강제 형변환"을 하였습니다.
// 이 부분은 나중에 배우니 이번시간에는 넘어갑시다.
printf("c = %g(a / b) \n", ((double)a / (double)b));
c = a % b;
printf("c = %d(a %% b) \n\n", c);
// 전위,후위 증가
printf("c = %d \n", c);
printf("++c = %d \n", ++c); // c를 출력하기 전에 증가!
printf("c = %d \n", c);
printf("c++ = %d \n", c++); // c를 출력한 후에 증가!
printf("c = %d \n\n", c);
// 전위, 후위 감소
printf("c = %d \n", c);
printf("--c = %d \n", --c); // c를 출력하기 전에 감소!
printf("c = %d \n", c);
printf("c-- = %d \n", c--); // c를 출력한 후에 감소!
printf("c = %d \n\n", c);
return 0; // 프로그램 종료
}
출력결과는 아래와 같습니다.
부가설명) 전위/후위 증감연산 |
위의 예제중 일부를 다시 봅시다.
#include <stdio.h>
int main(void)
{
int a = 21, b = -5, c;
//...중략...
// 현재 c의 값은 1입니다.
// 전위,후위 증가
printf("c = %d \n", c);
printf("++c = %d \n", ++c); // c를 출력하기 전에 증가!
printf("c = %d \n", c);
printf("c++ = %d \n", c++); // c를 출력한 후에 증가!
printf("c = %d \n\n", c);
// 전위, 후위 감소
printf("c = %d \n", c);
printf("--c = %d \n", --c); // c를 출력하기 전에 감소!
printf("c = %d \n", c);
printf("c-- = %d \n", c--); // c를 출력한 후에 감소!
printf("c = %d \n\n", c);
return 0; // 프로그램 종료
}
7번 줄에서는 "++c"연산이 수행됩니다.
c를 출력하기 전에 c에 ++(1증가)를 하고 그 후에 출력을 하기 때문에 값은 2가 되어 출력합니다.
하지만 13번 줄의 경우에는 "c++"연산이 수행됩니다.
이 경우엔 c를 출력하고 나서 c에 ++(1증가)를 하기 때문에 13번줄의 출력값은 2가 되지만 14번줄에서 c를 출력할때는 3이 출력됩니다.
2) 비교/관계연산자 |
두 피연산자를 비교, 관계를 보는 연산자 입니다.
연산자 | 연산자의 기능 |
a == b | a와 b의 값이 같으면 1, 아니면 0을 반환 |
a != b | a와 b의 값이 다르면 1, 같으면 0을 반환 |
a > b | a가 b 초과이면 1, 아니면 0을 반환 |
a < b | a가 b 미만이면 1, 아니면 0을 반환 |
a >= b | a가 b 이상이면 1, 아니면 0을 반환 |
a <= b | a가 b 이하이면 1, 아니면 0을 반환 |
(표의 출처 : 위키백과)
이제 예제를 통하여 알아봅시다.
#include <stdio.h>
int main(void)
{
int a = 5, b = 6;
printf("a = %d, b = %d \n", a, b);
printf("a == b : %d \n", a == b);
printf("a != b : %d \n", a != b);
printf("a > b : %d \n", a > b);
printf("a < b : %d \n", a < b);
printf("a >= b : %d \n", a >= b);
printf("a <= b : %d \n", a <= b);
return 0; // 프로그램 종료
}
결과는 아래와 같습니다.
이 비교/관계 연산자는 후에 배우는 "조건문"이나 "반복문"에 같이 사용됩니다.
3) 논리연산자 |
이 연산자는 논리 연산을 합니다.
(NOT, AND, OR 연산)
연산자 | 연산자의 기능 |
!a | a에 값이 있으면 0, 없으면 1, 또는 1이면 0, 0이면 1 (NOT 연산) |
a && b | a와 b가 같으면(둘다 1이면) 1, 다르면 0 (AND 연산) |
a || b | a또는 b가 1이면 1, 둘다 0이면 0 (OR 연산) |
(표의 출처 : 위키백과)
(이때 | 는 shift + \ 입니다.)
예제를 봅시다.
#include <stdio.h>
int main(void)
{
int num1 = 5, num2 = 6;
int a = num1 > num2;
int b = num1 <= num2;
int c = num1 != num2;
printf("a : %d \n", a);
printf("!a : %d \n", !a);
printf("a && b : %d \n", a && b);
printf("b && c : %d \n", b && c);
printf("a || b : %d \n", a || b);
printf("a && b && c : %d \n", a && b && c);
return 0; // 프로그램 종료
}
결과는 아래와 같습니다.
이 논리연산자는 후에 배우는 "조건문"에 주로 사용됩니다.
4) 비트연산자 |
이 연산자는 "비트 단위(2진수)" 연산을 합니다.
모든 수는 컴퓨터 내에서는 2진수로 표현되는데 이 2진수를 가지고 연산을 진행합니다.
연산자 | 연산자의 기능 |
~a | 피연산자의 모든 비트를 반전시킨다. (1은 0, 0은 1) |
a & b | a와 b를 AND연산 한다. |
a | b | a와 b를 OR연산 한다. |
a ^ b | a와 b를 XOR 연산 한다. |
a << b | a의 비트열을 왼쪽으로 b만큼 이동시킨다. |
a >> b | a의 비트열을 오른쪽으로 b만큼 이동시킨다. |
(표의 출처 : 위키백과)
위의 그림과 같이 연산을 진행합니다.
이제 예제를 봅시다.
#include <stdio.h>
int main(void)
{
int num1 = 5, num2 = 13;
printf("num1 & num2 : %d \n", num1 & num2);
printf("num1 | num2 : %d \n", num1 | num2);
printf("num1 ^ num2 : %d \n", num1 ^ num2);
printf("num1 << 2 : %d \n", num1 << 2);
printf("num2 >> 3 : %d \n", num2 >> 3);
printf("num1 : %d \n", num1);
printf("num2 : %d \n", num2);
return 0; // 프로그램 종료
}
위의 그림에서 봤던 5와 13을 이용하여 프로그램을 짜보았습니다.
결과는 아래와 같습니다.
5) 복합 할당연산자 |
이것은 위에서 배웠던 연산자들을 좀더 간단하게 표현하는 방식입니다.
연산자 | 연산자의 기능 |
a += b | a = a + b; |
a -= b | a = a - b; |
a *= b | a = a * b; |
a /= b | a = a / b; |
a %= b | a = a % b; |
a &= b | a = a & b; |
a |= b | a = a | b; |
a ^= b | a = a ^ b; |
a <<= b | a = a << b; |
a >>= b | a = a >> b; |
(표의 출처 : 위키백과)
뭔가 이해하기 힘들게 보이지만 예제를 보면 이해가 갈겁니다.
#include <stdio.h>
int main(void)
{
int a = 53, b = 7;
a += b;
printf("a += b, a = %d \n", a);
a -= b;
printf("a -= b, a = %d \n", a);
a *= b;
printf("a *= b, a = %d \n", a);
a /= b;
printf("a /= b, a = %d \n", a);
a %= b;
printf("a %%= b, a = %d \n", a);
a &= b;
printf("a &= b, a = %d \n", a);
a |= b;
printf("a |= b, a = %d \n", a);
a ^= b;
printf("a ^= b, a = %d \n", a);
a = 53, b = 7; // a ^= b 연산에서 대부분 0이 되어버리므로
a <<= b;
printf("a <<= b, a = %d \n", a);
a >>= b;
printf("a >>= b, a = %d \n", a);
return 0; // 프로그램 종료
}
결과는 아래와 같습니다.
다음시간에는 |
오늘은 연산자에 대해서 알아보았습니다.
하지만 여기에 있는 연산자가 전부가 아닙니다.
몇몇 연산자들이 더 있지만 아직 그것을 배우기에는 다른 것들을 더 배워야 이해가 가능합니다.
다음 시간에는 이전시간에 못배웠던 "형변환, 진수(진법)"에 대해서 알아보겠습니다.
'Study > C언어' 카테고리의 다른 글
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 11 [진수(진법) 그리고 형변환] (0) | 2018.10.17 |
---|---|
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 09 [주석과 상수] (0) | 2018.10.17 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 08 [변수에 대한 추가적인 이야기] (0) | 2018.10.17 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 07 [입력문과 출력문(printf, scanf, scanf_s)] (0) | 2018.10.17 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 06 [자료형2] (0) | 2018.07.08 |