Developer

10.(C언어) 연산, 연산자 본문

Programming Language/C

10.(C언어) 연산, 연산자

DPhater 2020. 8. 1. 20:56

C언어에는 여러가지 연산자가 존재한다.

기본 적인 사칙 연산부터 증감 연산자 등 여러가지 연산자가 존재한다.

 

사칙연산

#include<stdio.h>
int main(){
    int a,b,c,d;
    a=1+1;
    b=8-2;
    c=8*2;
    d=8/2;
    printf("%d %d %d %d\n",a,b,c,d);
    return 0;
}

코드1 실행 결과

코드1 처럼 +, -, *, / 한 값의 결과를 변수로 저장할 수 있다. 물론 변수끼리도 연산을 수행할 수 있다.

#include<stdio.h>
int main(){
    int a=8,b=2;
    int c,d,e,f;
    c=a+b;
    d=a-b;
    e=a*b;
    f=a/b;
    a=a+2;
    b=b-2;
    printf("%d %d %d %d %d %d\n",a,b,c,d,e,f);
    return 0;
}

코드2 실행 결과

a에 8 b에 2가 들어있는 상태로 변수 c에는 a와b 를 더한 값 즉 10이 들어가고,

d에는 a에서 b를 뺀 값 6이 들어간 것을 볼 수 있다.

printf함수 바로 위의 두 줄을 보자

a=a+2;

b=b-2;

등호 기호 오른쪽의 계산이 먼저 진행된다고 생각하면 된다.

a+2를 계산해 현재 a에 들어있는 8과 2를 더해 10이 되고, 10을 다시 a에 저장해주는 셈이다. b또한 마찬가지이다.

 

C에서는 a=a+2, b=b-2 와 같은 연산을 변수를 한번만 써도 되도록 +=,-= 등의 연산자를 제공한다.

a+=2 연산은 a=a+2의 축약형이라고 생각하면 된다. 이는 곱셈,나눗셈,나머지 연산등의 연산에도 적용된다.

#include<stdio.h>
int main(){
    int a=8,b=8,c=8,d=8;
    a+=2;    //a=a+2와 같다.
    b-=2;    //b=b-2와 같다.
    c*=2;    //c=c*2와 같다. 
    d/=2;    //d=d/2와 같다.
    return 0; 
}

코드3 실행 결과

C언어에서 사칙연산은 우리가 알고있는 것과 거의 같지만 나눗셈(/)를 할때 주의할 점이 있다. 한가지는 0으로 나눌경우 컴파일 에러가 발생하는 것이다.

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

코드4 실행 결과

또 한가지는 코드4에서 나오느것과 같은데 C에서는 정수끼리 나눗셈을 하면 결과도 정수가 나온다는 점이다. 코드4를 보면 a/b를 출력하는 것인데 결과로 2가 나오는것을 확인할 수 있다. 최대로 나올 수 있는 정수결과가 출력되는 것이다. 쉽게 정수의 나눗셈에서 나머지는 버리고 몫만 챙긴다고 생각하면 된다.

실수 끼리의 곱셈과 나눗셈 계산에서는 소수점 이하의 자리도 출력이된다.

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

코드5 실행 결과

하지만 실수의 연산에는 오차가 존재한다. 오차가 발생하는 이유는 모든 소수를 표현할 수 없으므로 근사치를 표현하기 때문이다. 따라서 실수의 계산에서는 적절한 처리가 필요하다.

나머지 연산자

코드4에서 정수끼리의 나눗셈에서는 나머지는 버려지고 몫만 취한다고 말하였다. 그렇다면 나머지를 알고싶을때에는 어떻게 할까? C에는 나머지 연산을 제공한다.

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

코드6 실행 결과

나머지 연산은 %를 사용한다. a%b는 a를 b로 나누었을때 나오는 나머지 값을 계산해준다. 이 나머지 연산은 정수에서만 사용할 수 있고 실수에서는 사용할 수 없다. 나머지 연산은 여러 곳에서 사용된다. 특히 어떤 수의 배수인지 확인할 때 사용할 수 있다. 많약 a가 b의 배수라면 a%b는 0이 될것이다.

증감 연산자

증감 연산자는 --,++ 연산자를 통해 해당 값을 1증가 혹은 감소 시켜주는 연산자이다. 포인터 연산에서는 자료형의 크기만큼 증가 감소 된다. 증감 연산자는 증가 혹은 감소시키고 싶은 변수의 앞과 뒤에 사용할 수 있다.

변수++ 변수-- --변수 ++변수

위의 4가지 처럼 사용할 수 있다. 하지만 동작 방식이 다르니 주의 하여야 한다.

#include<stdio.h>
int main(){
    int a=3,b=4;
    int c,d;
    c=a++;   //c에 a값을 할당한 뒤 a값을 1증가 
    d=b--;   //d에 b값을 할당한 뒤 b값을 1감소
	
    printf("%d %d %d %d\n",a,b,c,d) ;
    return 0;
}

코드7 실행 결과

a, b, c, d를 순서대로 출력했는데 4 3 3 4가 출력 되었다. c=a++; 연산은 c에 먼저 현재 a값을 할당하고 그 이후에 a값을 1 증가시키는 것이다.  따라서 c에는 a의 원래값인 3이 할당되고, 그 이후 a는 4가 되는 것이다.

d=b--또한 마찬가지이다. 이처럼 변수 뒤에 증감 연산자를 사용한 것을 후위 연산자라고 하며 동작은 먼저 현재의 값을 사용한 뒤 증감 연산자가 수행되는 것이다.

#include<stdio.h>
int main(){
    int a=3,b=4;
    int c,d;
    c=++a;   //a를 1증가 시키고 c에 대입 
    d=--b;   //b를 1감소 시키고 d에 대입
	
    printf("%d %d %d %d\n",a,b,c,d) ;
    return 0;
}

코드8 실행 결과

이번엔 증감 연산자가 변수의 앞에 사용되었다. 후위 연산자와 다르게 증감 연산자가 먼저 수행된 뒤 할당 과정을 진행한다. 이처럼 변수 앞에 증감 연산자를 사용한 것을 전위 연산자라고 하며 전위 연산자는 먼저 증감 연산자가 수행된 뒤 할당 과정을 수행한다.

정리

1.c언어에도 사칙 연산이 가능하다.

2.정수끼리의 연산 결과는 항상 정수이다.

3.실수의 연산에는 오차가 존재한다.

4.후위 연산자는 변수 뒤에 ++,-- 연산자가 오는것을 말하며 먼저 현재 값을 사용한 뒤 값을 증가 혹은 감소 시킨다.

5.전위 연산자는 변수 앞에 ++,-- 연산자가 오는것을 말하며 먼저 값을 증가 혹은 감소 시킨 뒤 변수를 사용한다.

Comments