4장-1 산술 연산자

2019. 1. 14. 19:40

Computer의 의미는 연산 장치입니다.
그러면 이제 본격적으로 연산을 시켜봐야겠죠?

산술연산자 + - * / % =

사칙연산

기본적으로 C언어는 덧셈 뺄셈 곱셈 나눗셈을 모두 사용할 수 있습니다.
덧셈과 뺄셈은 +, -기호를 사용하면 됩니다.
곱셈과 나눗셈은 키보드에 기호가 없기 때문에 조금 다릅니다. 곱셈은 *, 나눗셈은 / 기호를 사용합니다.

#include <stdio.h>
int main(void){
    printf("20 X 30 = %d\n", 20*30);
    return 0;
}

와 같은 방식으로 사용이 가능합니다. 콘솔에서는 20 X 30 = 600으로 보이겠죠.

앞서 배운 scanf를 활용하면

#include <stdio.h>
int main(void){
    int a, b;
    printf("숫자 입력 : ");
    scanf("%d %d", &a, &b);
    printf("20 X 30 = %d\n", a*b);
    return 0;
}

도 가능합니다. 그런데 나눗셈에서는 주의해야 할 게 있습니다.

#include <stdio.h>
int main(void){
    int a = 10, b = 3;
    printf("%d", a/b);
    return 0;
}

이런 프로그램이 있습니다. 10 / 3의 연산 결과를 출력하는 프로그램이죠.
수학에서 10 / 3 = 3.3333...입니다. 그런데 컴퓨터 언어는 다릅니다.
초등학교 때 배웠던 수학 기억하시나요? 10 을 3으로 나누면 몫은 3이었죠. C언어는 정수와 정수로 나눗셈을 하면 몫도 정수가 됩니다.

printf("%f", a/b);를 사용하면 괜찮지 않을까요? 안타깝게도 그렇지 않습니다.
두 변수가 정수일 경우 컴파일러는 정수연산을 합니다. 그러면 결과값도 정수이기 때문에 %f를 사용하면 결과만 이상해집니다.
그렇기 때문에 나눗셈 결과에 소수점이 필요하다면 변수를 선언할 때부터 실수형으로 선언해야 합니다.

다행히도 두 변수 중 하나라도 실수형 변수라면 컴파일러는 다른 변수도 실수형으로 변환해서 연산할 수 있습니다.

#include <stdio.h>
int main(void){
    float a = 10;
    int b = 3;
    printf("%f", a/b);
    return 0;
}

이 프로그램을 실행하면 b는 정수형으로 선언했음에도 불구하고 제대로 된 결과값이 출력됩니다.

%=연산

%는 나머지 연산입니다.
나머지 연산이 없다면, 나눗셈을 하고 나누는 수와 몫을 곱해서 원래의 수에서 빼야 합니다.
하지만 나머지 연산으로 표현이 간단해졌죠. printf("10 나누기 3 의 나머지 = %d\n", a%b); 처럼 사용할 수 있습니다. 결과는 10 나누기 3의 나머지 = 1이 됩니다

=은 대입 연산입니다.
수학에서는 등호라고 하지만 컴퓨터언어에서는 대입 연산이라고 불립니다. 그 이유는 연산 순서와 방향이 정해져 있기 때문이죠.
대입 연산은 오른쪽의 값을 왼쪽으로 대입하는 연산입니다. 우리는 변수를 선언할 때 a=10;과 같이 사용합니다.
하지만 10=a;라고는 사용할 수 없습니다. 오른쪽의 값을 왼쪽으로 대입하는 연산이기 때문에 10이라는 정수에 a의 값을 대입할 수 없기 때문이죠.

좀 깊게 들어가볼까요?

#include <stdio.h>
int main(void){
    int a= 20, b = 10;
    a = b = 5;
    printf("%d, %d",a, b);
    return 0;
}

이렇게 하면 어떻게 출력될까요?
처음에 a는 20, b는 10입니다.
그런데 다음 줄에서... 갑자기 멍해집니다. 이런 부분 때문에 연산의 순서를 알아둘 필요가 있습니다.

뒤쪽에서 배우겠지만 대입 연산은 오른쪽 부터 연산합니다.
대입 연산이 오른쪽의 값을 왼쪽으로 대입하는 연산이라고 했죠? 그렇기 때문에 ab의 값을 대입해야 합니다. 그 전에, 대입 연산은 오른쪽 부터 연산하기 때문에 b = 5연산을 먼저 하는것이죠. 그러므로 b는 5입니다.
콘솔 출력은 5, 5가 되겠죠.

대입 연산의 특성을 사용한 방법이 하나 더 있습니다. a = a + 5;와 같은 연산이죠. 수학에서는 말도 안되는 식입니다.
하지만 대입 연산에서는 가능합니다. 대입 연산은 오른쪽의 값을 왼쪽에 대입합니다. 그러면 오른쪽의 값을 먼저 알아야겠죠. 오른쪽의 값은 a + 5입니다. 그러니까 원래의 a 값에 5를 더한 값을 a에 대입하는 거죠. 이 연산을 계속 반복하면 a에 5를 더하는 연산을 계속 반복하는 겁니다.

복합대입연산자(Compound Assignment operator)와 증감연산자

이 두 가지 연산은 산술연산을 더 간단히 표현하는 방법입니다.
우선 복합 대입연산자는 대입할 변수에 어떤 연산을 수행해서 그 결과를 대입하는 연산을 간단히 표현하는 겁니다.
바로 위에서 배웠던 a = a + 5;가 그 예가 될 수 있겠죠. 이걸 줄여서 a += 5; 로 표현할 수도 있습니다.
덧셈 뿐 아니라 뺄셈, 곱셈, 나눗셈, 나머지 연산에도 사용할 수 있습니다. +=, -+, *=, /+, %=이렇게요. 뒤에서 배우게 될 비트연산자나 시프트 연산에도 사용할 수 있습니다!

a &= b;
a |= b;
a ^= b;
a <<= b;
a >>= b;

증감연산자는 변수에 1을 더하고 빼는 연산자입니다. a++; 같은 식으로 쓰는 연산자입니다. 이 연산을 하면 a에 1이 더해지죠.
이 연산자는 덧셈과 뺄셈 밖에 없습니다. 1을 곱하거나 나누는 것은 의미가 없으니까요.

증가 연산에도 두 가지 표현이 있습니다. a++;뿐 아니라++a;로도 쓸 수 있거든요. 이번엔 딱 봐도 알겠죠? 연산 순서에 따라 달라진다는 것을요. ++a는 덧셈 연산을 먼저 하고 다음 연산을 하는 겁니다. a++는 다른 연산을 먼저 하고 덧셈을 합니다.

여기서 다른 연산은 한 문장에서 덧셈 외의 연산같은 것들을 말합니다.
예를 들어 a = 5;인 변수가 있을 때 printf("%d",a++);가 있을 수 있습니다. 이 명령은 5가 출력됩니다. 하지만 printf 연산 후에 a는 6이 되죠.
printf("%d",++a);는 6을 출력합니다. 그리고 출력 이후에도 a 값은 6입니다.

내용이 너무 길기도 하고 연산 치고는 성격이 좀 다른 내용이어서 다음 편에서 이어서 하도록 하겠습니다.
다음 편에서는 비트 연산과 시프트 연산, 그리고 연산 순서에 대해 알아보겠습니다.
연산 순서는 여러가지 연산자들 사이에서 어떤 순서로 처리되는지 알아야 원하는 대로 프로그램이 실행되기 때문에 중요합니다.

요약

  • 산술 연산자로 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/)을 할 수 있다.
  • 정수 나눗셈과 실수 나눗셈의 차이를 알 수 있다.
  • 나머지 연산(%)과 대입 연산(=)을 할 수 있다.
  • 대입 연산의 순서를 알 수 있다.
  • +=, -= 같은 복합 대입 연산자를 사용할 수 있다.
  • a++, ++a같은 증감연산자를 사용할 수 있다.

'컴퓨터공학 > C' 카테고리의 다른 글

2장-2 변수의 크기와 오버플로우, 언더플로우  (0) 2019.05.05
4장-2 비트 연산과 연산 순서  (0) 2019.01.14
3장 printf scanf 함수  (0) 2019.01.10
2장-1 자료형  (0) 2019.01.10
1장-1 Hello World  (0) 2018.12.16

+ Recent posts