프로그래밍 언어/C언어

C언어 4. 연산자

닉네임못짓는사람 2020. 7. 10. 17:09
반응형

지금까지는 C언어 내에서 데이터들을 저장하는 법을 알아보았습니다.

이번 글에서는 그 데이터를 가지고 실제로 계산을 하는 연산자들에 대해서 알아보겠습니다.

 

먼저 연산은 피연산자와, 연산자로 구성된다는 사실을 알고 계실 겁니다.

예를 들어 수식 2 + 3 * 10이 있다고 하면, 2, 3, 10은 피연산자 +, *는 연산자라고 합니다.

 

연산자의 종류


C언어에는 많은 연산자가 존재하고 있는데, 표를 통해 먼저 보고 이후에 설명하도록 하겠습니다.

먼저 산술 연산자에 대해서 알아봅시다.

이는 우리들이 초등학교 때부터 배워온 사칙연산에 사용하는 연산자들이 포함되어 있습니다.

그런데 이중 % 라는 연산자가 생소하신 분이 있을 수도 있는데, 이 연산자는 modulo연산을 수행합니다.

modulo연산은 나눗셈을 실행하고 그 나머지를 구해주는 연산자입니다.

예를 들어 10 % 3 은 나머지인 1을 구해줍니다.

 

부호 연산자는 데이터의 부호를 정해주는 연산자입니다.

따로 설명할만한 내용이 없기 때문에 생략하도록 하겠습니다.

 

대입 연산자는 연산자를 기준으로 왼쪽에 있는 변수에 오른쪽에 있는 데이터를 입력하는 연산자입니다.

또한 +=, *= 등등 산술 연산자와 합쳐진 연산자들이 보이는데, 간단히 예를 들어 설명하겠습니다.

예를들어 변수 a가 있고, 그 값이 2이며 a += 10를 수행한다고 생각해봅시다.

그러면 이는 a = a + 10과 동일한 의미, 즉 a = 2 + 10과 동일한 것입니다.

따라서 연산을 수행한 후 a의 값은 12가 됩니다. 어렵지 않을 것이라 생각합니다. 

 

증감 연산자는 변수의 값을 1증가시키거나 1감소시킬때 사용합니다.

그런데 이 증감연산자는 연산자를 변수의 앞에 쓰냐, 뒤에 쓰느냐에 따라 전위, 후위로 나뉩니다.

변수의 앞에 연산자를 쓰는 것이 전위 증감연산자, 뒤에 쓰는것이 후위 증감 연산자입니다.

간단한 코드를 통해 둘의 차이를 설명하겠습니다.

#include<stdio.h>

int main() {
	int a = 1;
	int b = 2;

	printf("%d, %d\n", a++, b++);
	printf("%d, %d\n", ++a, ++b);
}

결과를 확인해보시면 첫 번째 출력에선 a와 b의 값이 그대로 출력되는 걸 볼 수 있습니다.

그런데 두 번째 출력을 보면 어찌 된 일인지 1이 아닌 2가 더해진 것을 볼 수 있습니다.

이것은 전위, 후위에 따라서 변수의 값이 증감되는 시간이 다르기 때문인데요,

전위의 경우엔 변수를 출력한 후에 값이 증가되고, 후위의 경우엔 값을 증가시키고 변수를 출력합니다.

 

다음은 비교 연산자입니다. 이름부터 알 수 있듯이 두 변수를 비교하는 연산자입니다.

수학에선 보통 두 수가 같으면 =기호를 사용하지만, C언어에서는 위에서 보셨다시피 =는 이미

대입 연산자로 사용되고 있습니다. 따라서 두 수가 같음을 표현할 땐 ==를 사용합니다.

반대로 두 수가 다를 경우엔!=를 사용해서 이를 표현해줍니다.

 

이 연산자의 경우에는 사용자에게 결과가 True(참)인지 False(거짓)인지 알려줍니다.

그런데 저번 글에서 알아본 자료형 중엔 이러한 논리 값을 저장하는 자료형은 없었습니다.

사실 C언어에서는 논리값을 정수로 표현하며, 1은 True(실제론 0 이외의 숫자), 0은 False를 의미합니다.

따라서 연산의 결과가 True이면 1을, False이면 0을 돌려주게 되는 것입니다.

진짜 그런 것인지 코드를 통해서 확인해볼까요?

#include<stdio.h>

int main() {
	int a = 10;
	int b = 5;
	printf("%d\n", a == b);
	printf("%d\n", a < b);
	printf("%d\n", a > b);
	printf("%d\n", a != b);
	printf("%d\n", !(a == b));
}

결과를 보시고 직접 True, False를 판단해보시면 위의 말이 맞다는 것을 알 수 있을 겁니다.

 

논리 연산자는 위에서 말한 True, False값을 사용해 연산을 수행하는 연산자입니다.

&&는 AND라고 말하며 두 값이 모두 True일 경우에만 True를 돌려주는데, 이를 곱 연산이라고 합니다.

||는 OR라고 말하며 두 논리 값 중 하나만 True여도 True를 돌려줍니다. 이를 합연산이라고 합니다.

! 은 NOT을 의미하며 논리 값이 True면 False를, False이면 True를 돌려줍니다. 즉 반전시킨단 이야기죠.

 

비트 연산자의 경우는 변수의 비트 값에 대해서 연산을 수행하는 연산자입니다.

순서대로 |는 OR연산,  &는 AND연산, ~는 NOT연산 ^는 XOR연산을 수행합니다.

여기서 XOR란 두 논리 값 중 1이 홀수면 True, 짝수거나, 없으면 False를 반환합니다.

예를 들어 10진수 10, 5가 있다고 가정해봅시다. 둘은 2진수로 바꾸게 되면각각 1010(10), 0101(5)입니다. 

이 두 비트에 대해서 XOR연산을 수행하면 결과는 1111이 되고, 따라서 값은 15가 됩니다.

(이 둘은 unsigned, 즉 음수 값이 없는 2진수라고 가정합니다.)

간단한 코드로 이를 확인해봅시다.

#include<stdio.h>

int main() {
	int a = 10;
	int b = 5;
	printf("%d", a ^ b);
}

남은 <<와 >>는 비트를 시프트 시키는 연산자인데요,

이는 비트를 왼쪽, 오른쪽으로 이동시킨다는 의미입니다.

예를 들어 위에서 말한 1010에 << 1을 수행하면, 비트가 왼쪽으로 한 칸씩 이동합니다.

그런데 왼쪽으로 한칸 시프트 하면 표현할 수 있는 4비트를 넘어가게 됩니다.

그러면 이 넘어간 값들은 모두 사라지게 됩니다. 즉, 값은 0100 = 4가 되는 것이죠.

 

다음으로 포인터 연산자와 구조체 연산자가 있는데 포인터와 구조체를 아직 안배웟으니 생략하겠습니다.

 

마지막은 삼항 연산자입니다.

이것은 논리 값과 돌려줄 값 두 개를 통해 사용하는데, 예를 들어 설명하겠습니다.

10 == 10 ? 100 : 200이라는 삼항 연산 식이 있습니다. ?의 왼쪽에는 논리 값이 오게되는데, 이 논리값이

True이면 :의 왼쪽에 있는 값을 반환하고 False이면 오른쪽에 있는 값을 반환합니다.

 

연산자의 우선순위


이렇게 C언어에서 사용되는 연산자들의 종류와 사용법에 대해서 알아봤는데요,

이 연산자들 사이에서도 정해진 우선순위가 존재합니다.

이는 수학과 비슷한데, 수학에서도 *와 /는 +나 -보다 먼저 계산되는 걸 알고 계실 겁니다.

C언어에서도 여러 연산자들이 같이 있을 때 어떤 것을 먼저 수행할지 결정하는 우선순위가 있습니다.

먼저 표를 보도록 합시다.

연산자의 우선순위는 표에서 숫자가 작은 것이 우선순위가 높은 것입니다.

또한 결합 순서란 같은 우선순위 내에서 연산이 어떤 순서로 될 것인가를 나타낸 것입니다.

예를 들어 10 * 2 / 5에서 *와 /는 우선순위가 같은데, 결합 순서가 왼쪽부터이기 때문에

연산을 왼쪽에서부터 10 * 2 -> 20 / 5 -> 4 순서로 하는 것을 의미합니다.

 

연산자에 대한 설명은 이 정도로 마치고, 다음번엔 입출력에 대해서 설명해보겠습니다.

감사합니다.

반응형

'프로그래밍 언어 > C언어' 카테고리의 다른 글

C언어 6. 조건문  (0) 2020.07.11
C언어 5. 입출력  (0) 2020.07.10
C언어 3. 자료형  (0) 2020.07.09
C언어 2. 변수, 상수  (0) 2020.07.09
C언어 1. 개발 툴 설치  (0) 2020.07.09