본문 바로가기
c언어

c언어 산술 연산자에 대하여 알아보기

by 개발자 L 2022. 11. 27.
반응형

c언어 산술 연산자에 대하여 알아보기

네 안녕하세요, 이번 포스팅에서는 c언어 산술 연산자에 대하여 알아보는 시간을 가져보려 합니다.

흔히 우리가 이야기하는 산술 연산자와 거의 똑같습니다.

우리가 하는 사칙연산이죠 ㅎㅎ

그런데 프로그래밍 언어에서 표현을 할 때 쓰는 문자들이 겹치는 경우가 있어서 그러한 문자들을 조금 변경을 한 것들이 있습니다.

그래서 이번 포스팅에서는 c언어에서 산술 연산자를 연산자들이 어떤 것들이 있으며, 어떤 방법으로 쓰이는지 한 번 알아보려 합니다.

그럼 지금부터 같이 보실까요?

 

1. 산술 연산자

산술 연산자는 앞서 말씀드렸다시피 우리가 연산을 할 때 쓰는 연산자입니다.

우리가 하는 사칙연산이 여기에 포함이 됩니다.

그런데 제가 이 중에서 조금 다른 문자로 표현이 되는 연산자가 존재한다고 그랬죠?

그래서 제가 그러한 연산자들을 포함하여 간단하게 표로 정리를 해봤습니다.

연산자 기호 사용예시 결과값
덧셈 + 1 + 2 3
뺄셈 - 2 - 1 1
곱셈 * 2 * 3 6
나눗셈 / 4 / 2 2
나머지 % 3 % 2 1

이런 식으로 표현이 가능합니다.

여기에서 보면 곱셈과 나눗셈, 그리고 나머지 연산자가 다릅니다.

컴퓨터에서는 곱셈의 경우는 문자 x와 겹쳐서 쓸 수 없으며, 나눗셈의 경우는 그러한 문자가 키보드에는 없어서 새롭게 써야만 했고, 나머지의 경우는 보통 나눗셈 후 몫과 나머지를 한 번에 표현을 하곤 하죠?

이를테면 2 ... 1 이런 식으로요.

여기에서 앞이 몫이고, 뒤가 나머지죠?

그런데 이 ...은 프로그래밍 언어에서 대화형 인터프리터를 켜서 쓸 때 조건문이나 반복문 등을 썼을 때 들여 쓰기 칸에 저렇게 뜹니다.

그래서 이 역시도 사용 문자가 겹치기 때문에 쓸 수 없습니다.

그럼 이를 이용한 간단한 예제를 통하여 같이 봅시다.

#include <stdio.h>

int main()

{
	int x, y, result;
    
	printf("두 개의 정수를 입력하세요 : ");
	scanf("%d %d", &x, &y);
    
	result = x + y; // 덧셈 연산
	printf("%d + %d = %d\n", x, y, result);
    
	result = x - y; // 뺄셈 연산
	printf("%d - %d = %d\n", x, y, result);
    
	result = x * y; // 곰셈 연산
	printf("%d * %d = %d\n", x, y, result);
    
	result = x / y; // 나눗셈 연산
	printf("%d / %d = %d\n", x, y, result);
    
	result = x % y; // 나머지 연산
	printf("%d %% %d = %d\n", x, y, result);
    
	return 0;
}

여기에서 주의를 해야 하는 사항이 있습니다.

제일 마지막에 나머지를 구할 때 %를 두 번 쓰지 않으면 제대로 된 값이 나오지 않습니다.

만일에 %를 한 번 썼을 때 어떤 결과가 나오는지 한 번 보겠습니다.

두 개의 정수를 입력하세요 : 4 5
4 + 5 = 9
4 - 5 = -1
4 * 5 = 20
4 / 5 = 0
4 %d = 5

이런 식으로 나와서 뒤에 들어올 정수 값을 인식하지 못하고 형식 지정자가 출력이 되며, 우리가 입력을 해야 하는 값이 등호 뒤에 나오게 됩니다.

그 이유는 형식 지정자를 쓸 때 %를 붙이는데, 그것과 겹쳐져서 오류가 발생하기 때문입니다.

그럼 %를 두 번 썼을 때는 어떻게 되는지 한 번 볼까요?

두 개의 정수를 입력하세요 : 4 5
4 + 5 = 9
4 - 5 = -1
4 * 5 = 20
4 / 5 = 0
4 % 5 = 4

이런 식으로 제대로 값이 나오는 걸 볼 수 있습니다.

그래서 우리가 나머지 연산을 할 때는 늘 주의를 기울여야 합니다.

그리고 위 예제는 정수형 변수로 연산을 한 거지만, 실수로도 연산이 가능합니다.

그럼 실수로 연산을 한 예제도 한 번 같이 살펴볼까요?

#include <stdio.h>

int main()

{
    double x, y, result;

    printf("두 개의 실수를 입력하세요 : ");
    scanf("%lf %lf", &x, &y);

    result = x + y;
    printf("%f + %f = %f\n", x, y, result);

    result = x - y;
    printf("%f - %f = %f\n", x, y, result);

    result = x * y;
    printf("%f * %f = %f\n", x, y, result);

    result = x / y;
    printf("%f / %f = %f\n", x, y, result);
    
    return 0;
}

이런 식으로 작성을 할 수 있습니다.

그런데 여기서 정수형 연산과 조금 차이가 보이지 않나요?

실수형은 정수형과는 다르게 나머지 연산을 쓰지 않습니다.

실수형은 어차피 소수점 연산이 가능하기 때문에 굳이 나머지를 구하지 않더라도 소수점으로 표현이 가능하기 때문입니다.

실수형 자료형으로 연산을 하겠다는 것은 정수로 딱 떨어지지 않는 숫자를 연산하겠다는 의미와도 같으니까요.

그럼 결과는 어떻게 나오는지 한 번 볼까요?

두 개의 실수를 입력하세요 : 4 5
4.000000 + 5.000000 = 9.000000
4.000000 - 5.000000 = -1.000000
4.000000 * 5.000000 = 20.000000
4.000000 / 5.000000 = 0.800000

이렇게 나옵니다.

수가 실수형이기 때문에 굳이 몫과 나머지를 구할 필요가 없어집니다.

 

2. 나머지 연산자

이 중에서 조금 눈여겨볼 것은 나머지 연산자입니다.

나머지 연산자는 여러 방면에서 다방면으로 쓰이기 때문입니다.

이를테면 홀수와 짝수를 구분 지을 때 쓰인다던지, 초 단위의 시간을 받아서 계산할 때도 쓰이곤 합니다.

그럼 간단한 예제를 통해 같이 보실까요?

#include <stdio.h>
#define SEC_PER_MINUTE 60

int main()

{
    int input, minute, second;

    printf("초를 입력하세요 : ");
    scanf("%d", &input);

    minute = input / SEC_PER_MINUTE;
    second = input % SEC_PER_MINUTE;

    printf("%d초는 %d분 입니다. \n", input, minute, second);

    return 0;
}

이런 식으로 한 번 간단히 써봤습니다.

여기서 SEC_PER_MINUTE라는 상수를 #define을 이용하여 선언을 했습니다.

1분은 초로 전환하면 60초이기 때문에, 상수는 60으로 지정을 했습니다.

그리고 전에 상수와 관련된 포스팅을 쓴 적이 있었는데, 거기에서 이렇게 하면 중요한 값을 고정하는 것과 같기 때문에

누가 그 값을 건들 수가 없으며, 글로써 정의를 내려버리기 때문에 가독성 측면에서 더 좋아진다고 했습니다.

그래서 상수를 선언했습니다.

그리고 분은 입력되는 숫자를 SEC_PER_MINUTE로 나눈 값이 되고,

초는 입력한 값을 SEC_PER_MINUTE로 나눠서 남은 나머지가 됩니다.

그럼 결과는 어떤 식으로 나오는지 한 번 같이 볼까요?

초를 입력하세요 : 1000
1000초는 16분입니다.

이렇게 숫자를 입력하게 되면 입력한 숫자를 분과 초로 변환을 시켜서 반환을 하게 됩니다.

어때요, 정말 신기하죠? ㅎㅎ

이렇게 무언가를 다른 형태로 변환을 해주는 프로그램은 정말 여러 곳에서 많이 쓰이기 때문에 잘 알아두시면 좋습니다.

반응형

 

3. 부호 연산자

부호 연산자는 말 그대로 부호가 있는 연산자입니다.

쉽게 말하면 양수와 음수를 나타내는 값을 말합니다.

우리가 수학 시간에 양수와 음수를 표기를 하는 것과 같이 똑같이 씁니다.

x = -10;
y = -x;

이렇게 문자 앞에도, 그리고 숫자 앞에도 모두 쓸 수가 있습니다.

 

4. 증감 연산자

증감 연산자는 c언어에서 쓰는 연산자 중에 단항 연산자에 속하는 연산자입니다.

이 증감 연산자는 변수의 앞 또는 뒤에 붙이게 되는데,

앞에 붙이면 전위 연산자, 뒤에 붙이면 후위 연산자가 됩니다.

이런 식으로 쓰게 됩니다.

//전위 연산자 표기
y = ++x;
x = --y;

// 후위 연산자 표기
x = y--;
y = x++;

이렇게 보통 씁니다.

여기서 전위 연산과 후위 연산의 특징은 이렇습니다.

전위 연산은 '선 연산 후 대입'이라는 특징을 가지고,

후위 연산은 '선 대입 후 연산'이라는 특징을 가집니다.

그래서 이 둘의 연산은 순서가 다르기 때문에 같은 값이 나오는 경우가 있기는 하나, 그럴 확률이 매우 희박합니다.

그리고 증감 연산자는 이러한 특징도 갖습니다.

  • 괄호 내에 있어도 증감 연산자가 붙은 변수의 값의 연산은 제일 나중에 실행이 된다.
  • 증감 연산자는 상수에는 적용이 불가능하다.
  • 증감 연산자는 수식에도 적용이 불가능하다.

이를테면 이런 경우들이 있습니다.

y = (1 + x++) + 10; // 괄호 내에 있어도 제일 나중에 연산이 됨.
x = 10++; // 상수에 선언할 수 없음.
y = (x + 1)++; 수식에 선언할 수 없음.

이렇습니다.

그러면 간단한 예제를 통해 한번 살펴보도록 할까요?

#include <stdio.h>

int main()

{
    int x = 10, y = 10;

    printf("x = %d\n", x);
    printf("++x의 값 = %d\n", ++x);
    printf("x = %d\n\n", x);

    printf("y = %d\n", y);
    printf("y++의 값 = %d\n", y++);
    printf("y = %d\n", y);

    return 0;
}

이렇게 한 번 간단하게 작성을 해봤습니다.

여기에서 주의를 해야 할 점은, 우리가 증감 연산자를 썼을 때, 출력 시 대응되는 값에도 증감 연산자가 똑같이 붙어야 연산이 된다는 것입니다.

그 이유는 그냥 변수 x의 값과 증감 연산자가 붙어서 나오는 x의 값이 서로 다르기 때문에 그 값을 달리 해야지 값을 받을 때 에러가 생기지 않습니다.

그럼 결과는 어떻게 나왔는지 한 번 볼까요?

x = 10
++x의 값 = 11
x = 11

y = 10
y++의 값 = 10
y = 11

이렇게 연산의 순서가 다르게 찍혀서 나온 것을 볼 수 있습니다.

전위 연산자는 먼저 연산이 된 후에 대입이 되기 때문에 1이 더해 11을 만들고서 대입을 해주고,

후위 연산자는 일단 원래 수를 먼저 대입을 해주고, 최종 출력 시에 연산을 해서 출력을 합니다.

이 차이가 상황에 따라서 나중에 큰 차이를 만들 수 있기 때문에 연산 순서를 꼭 기억해야 합니다.

 

여기까지 c언어 산술 연산자에 대하여 알아보는 시간을 가졌습니다.

다음 포스팅에서는 c언어 대입 연산자에 대하여 한 번 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 다시 한 번 감사합니다 ~

반응형

댓글