본문 바로가기
C

2. 연산자

by heekng 2021. 1. 19.
반응형
 

C에서 사용하는 여러가지의 연산자에 대하여 알아보겠습니다.


1. 산술연산자

산술연산자란, 주로 숫자의 계산을 위하여 사용합니다.

산술연산자의 종류는 다음과 같습니다.

+

더하기

값을 더합니다.

-

빼기

값을 뺍니다.

*

곱하기

값을 곱합니다.

/

나누기

값을 나눕니다.

%

나누고 남은 나머지

값을 나누고 난 나머지를 리턴합니다.

-

부호변경

하나의 값의 부호를 바꿉니다(== * -1)

산술 연산에서 서로 다른 자료형의 값을 연산하면 결과값은 다음과 같이 바뀌게 됩니다.

1) int와 float => float

2) int와 char => int

3) char과 float => float

이는 각각의 자료형이 가지고 있는 byte와 관련되었는데, 서로 다른 자료형이 산술 연산될 때에 더 큰 byte값을 가지고있는 자료형에 맞추어 자료형이 선택됩니다.


2. 대입연산자

대입연산자는 대표적으로 변수에 결과를 대입하기 위하여 사용됩니다.

가장 대표적으로 사용되는 대입연산자는 = 이고, = 이외에 연산과정을 줄이기 위한 여러가지 대입연산자가 있습니다.

=

a = 2;

a에 2를 대입한다.

+=

a += 2;

a값에 2를 더한 값을 a에 대입한다.

-=

a -= 2;

a값에 2를 뺀 값을 a에 대입한다.

*=

a *= 2;

a에 2를 곱한 값을 a에 대입한다.

/=

a /= 2;

a에 2를 나눈 값을 a에 대입한다.

%=

a %= 2;

a에 2를 나누고 남은 나머지를 a에 대입한다.

연산 과정이 줄어든다는 이유는 예를들어

a = a + 2; 라는 코드를 실행한다고 가정하면 1) a+2계산 2) 계산결과를 a에 대입 하는 과정으로 2번의 연산을 합니다.

하지만 a += 2; 대입연산자를 이용하면 a에 2를 더한다는 한번의 연산을 하게 됩니다.

따라서 연산과정이 줄어들어 좋은 효율이 나옵니다.


3. 논리연산자

논리연산자는 True(1)과 False(0)을 논리적으로 연산하기 위한 연산자입니다.

True와 False는 참과 거짓을 뜻합니다.

또한, C에서 False는 0이고 그 이외의 숫자는 모두 true로 판단합니다.

논리연산자는 다음과 같습니다.

AND

a && b

a와 b 둘다 참이여야 참

OR

a || b

a와 b 둘중에 하나라도 참이면 참

NOT

!a

a가 참이라면 거짓, 거짓이라면 참


4. 비교연산자

비교연산자는 두개의 항을 비교한 결과를 나타내는 연산자이며, 참(True, 1)과 거짓(False, 0)으로 리턴됩니다.

비교연산자는 다음과 같습니다.

같다

a == b

a 와 b가 같은가

작다

a < b

a가 b보다 작은가

작거나 같다

a <= b

a가 b보다 작거나 같은가

크다

a > b

a가 b보다 큰가

크거나 같다

a >= b

a가 b보다 크거나 같은가

같지 않다

a != b

a가 b와 같지 않은가

두 항을 비교하여 값이 리턴되며, 리턴되는 결과값은 0(거짓)과 1(참)으로 나타납니다.


5. 증감연산자

증감연산자는 증가연산자와 감소연산자로 이루어져있습니다.

증감연산자 또한 대입연산자와 비슷한 맥락의 연산자입니다.

증감연산자는 다음과 같이 이루어져있습니다.

++

a++

++a

a에 1을 더한다.

--

a--

--a

a에 1을 뺀다.

++는 a = a + 1; => a += 1; => a++;

--는 a = a - 1; => a -= 1; => a--;

과 같은 과정으로 이루어지는 연산을 한번의 연산으로 단축시켜줍니다.

증감연산자를 이용할 때 알아야 하는 내용으로 전위연산과 후위연산이 있습니다.

전위연산이란 증감연산자가 변수의 앞에 붙어있을 때 (++a, --a)를 나타내며, 연산을 할 때에 가장 먼저 처리합니다.

후위연산이란 증감연산자가 변수의 뒤에 붙어있을 때 (a++, --a)를 나타내며, 연산을 할 때 연산이 끝나고 나서 처리합니다.

#include <stdio.h>

 

void main() {

int num = 4;

int result;

result = ++num; //전위증가연산자

printf("num: %d\nresult: %d", num, result);

}

변수 num에 4를 넣어둔 후에 result = ++num;을 통하여 전위증가시킨후 result에 담았습니다.

이후 실행하여 출력하면 5, 5로 동일한 값이 출력됩니다.

전위증가연산자는 먼저 해당값(num)에 우선적으로 연산됩니다.

#include <stdio.h>

 

void main() {

int num = 4;

int result;

result = num++; //후위증가연산자

printf("num: %d\nresult: %d", num, result);

}

후위증가시킨 값을 실행해 출력하면 result값은 기존 num에 들어가있던 4가 출력되고, num값은 5가 출력됩니다.

후위증가연산자는 result에 기존 num값이 먼저 대입되고, 이후에 증가됩니다.


6. 비트연산자

비트연산은 수를 2진수으로 변경, 0과 1로 구별하여 연산합니다.

비트연산은 비트논리연산과 시프트연산으로 구성되어있습니다.

1) 비트논리연산자

AND

a & b

a와 b의 각각의 비트를 AND연산

OR

a | b

a와 b의 각각의 비트를 OR연산

XOR

a ^ b

a와 b의 각각의 비트를 XOR연산

NOT

~a

a의 비트를 모두 NOT연산

비트논리연산은 해당하는 수를 2진수로 변경하여 연산합니다.

예를들어 10진수 12와 3을 비트연산한다 가정하면

12(10진수) = 1100(2진수), 3(10진수) = 0011(2진수)로 나타납니다.

두 수의 각각의 자리마다 AND연산한다면 0000이 나오고 이가 나타내는 수는 0이므로 false를 나타냅니다.

#include <stdio.h>

 

void main() {

int a, b;

a = 3;

b = 12;

int c = a & b;

printf("값: %d", c);

}

만약 15와 5를 AND 비트논리연산한다면

15(10진수) = 1111(2진수), 5(10진수) = 0101(2진수) 로 나타나고 결과값은 0101(2진수)이 나오며 0이 아니기 때문에 true(1)가 출력됩니다.

#include <stdio.h>

 

void main() {

int a, b;

a = 15;

b = 5;

int c = a & b;

printf("15와 5의 비트논리연산 값: %d", c);

}

2) 시프트연산자

시프트연산은 비트를 왼쪽 또는 오른쪽으로 원하는 비트수만큼 이동하는 연산입니다.

왼쪽 시프트

a << n

a를 왼쪽으로 n비트만큼 이동

오른쪽 시프트

a >> n

a를 오른쪽으로 n비트만큼 이동

만약 10을 왼쪽으로 3비트만큼 이동한다면, 10(10진수) = 0101(2진수)에서 각각의 자릿수를 왼쪽으로 3칸씩 옮기고 비어있는 3개의 칸은 0으로 채워지게 됩니다.

따라서 1010(2진수)는 왼쪽으로 3비트 이동한 101 0000(2진수)가 되고 이는 80을 나타냅니다.

#include <stdio.h>

 

void main() {

int a;

a = 10;

printf("10을 왼쪽으로 3비트 이동한 값: %d", a << 3);

}

왼쪽시프트 연산은 왼쪽으로 한칸 이동할 때마다 각각의 자릿수가 2만큼 곱한 값이 됩니다.

따라서 간단하게 연산하는 방법은 10을 왼쪽으로 3비트 이동한다 == 10 * 2^3(n번 왼쪽으로 이동 == 2를 n번 곱한다.)입니다.

오른쪽 시프트 연산은 수의 각각의 비트를 오른쪽으로 이동하는 것입니다.

10을 오른쪽으로 1비트 이동한다면 10(10진수) = 1010(2진수)의 각각의 비트가 1만큼 오른쪽으로 이동해 0101(2진수)가 됩니다.

따라서 출력되는 값은 5가 됩니다.

#include <stdio.h>

 

void main() {

int a;

a = 10;

printf("10을 오른쪽으로 1비트 이동한 값: %d", a >> 1);

}

위처럼 오른쪽시프트연산으로 인해 비게 되는 기존의 비트는 0으로 채워지고, 가장 오른쪽에 존재하던 비트는 사라지게 됩니다.

오른쪽시프트연산은 각각의 비트가 오른쪽으로 한칸씩 이동할 때마다 1/2로 작아지게 됩니다.

따라서 간단하게 연산하는 방법은 10을 오른쪽으로 1비트 이동한다 == 10 * (1/2)^1 (n번 오른쪽으로 이동 == 1/2를 n번 곱한다.)입니다.

반응형