여러분이 어떤 계산을 수행하고자 할 때, 보통 식을 작성하여 그렇게 한다. C 언어에서 산술 연산은 산술식으로 표현된다.

다음은 산술식의 한 예이다.

         a + b

위에서 a, b를 피연산자(operand)라 하고, +는 연산자(operator)라 한다.
산술식에서는 피연산자가 정수와 실수와 같은 수치 데이터이다. 또한 연산자를 산술 연산자라 한다.

C 언어는
산술 연산을 위해서 다음과 같은 산술 연산자를 제공한다.

 
연산
연산자
 

덧셈

뺄셈

곱셈

나눗셈

나머지 계산

+

-

*

/

%

다음은 산술 식의 예이다.

            2 + 10
          7.5 - 4.2
          3.14 * 5.7
          26 / 4

산술 식은 다음과 같이 피연산자로 변수를 포함할 수 있다.

       x + 5

이 경우, 왼쪽 피연산자의 값은 x에 저장된 값이다. 


 

1. 연산자의 유형

수학에서와 마찬가지로, 연산자는 두 가지 형태일 수 있다.   단항 연산자이항 연산자. 단항 연산자는 피연산자를 단지 한 개만 가지며, 이항 연산자는 두 개의 피연산자를 갖는다.

C 언어의 산술 연산자 모두 (+, -, *, /, %) 이항 연산자이다. 그러나 -는 또한 단항 연산자이다. 따라서 다음 식은 올바르다.

             x - y
           - x

-가 이항 연산자인 경우에 그 의미는 뺄셈 연산자이지만, 단항 연산자인 경우에 그 의미는 피연산자의 값을 음수화시킨다. 따라서 x에 저장된 값이 5이면, -x의 값은 -5이다.

 

2. 산술식 유형

산술 식의 유형을 크게 다음과 같이 구분할 수 있다 : 정수형, 실수형, 혼합형.

 
산술식
설명
 
정수형
두 개의 피연산자가 모두 정수이다.
 
실수형
두 개의 피연산자가 모두 실수이다.
 
혼합형
한 개의 피연산자는 정수이고,
다른 한 개의 피연산자는 실수이다.

정수형 식의 결과 값은 정수이고, 실수형과 혼합형 식의 결과 값은 실수이다.
다음 식을 생각해보자.

   
x + y
   
 


x, y가 모두 정수이면 위의 식은 정수형 식이고, 그 결과 값은 정수이다.

x, y가 모두 실수이면 위의 식은 실수형 식이고, 그 결과 값은 실수이다.

x, y중에서 한 개가 정수이고 다른 한 개가 실수이면 식은 혼합형 식이고,
   그 결과 값은 실수이다.

 
     



다음 식을 생각해보자.

           n + 5

위에서 변수 n이 int 변수이면, 식의 결과 값은 정수이고, n의 타입이 double이면 식의 결과 값은 double 타입이다.


 

다른 식을 생각해보자.

          n + 2.5

이 경우, n이 int 또는 double 타입이든지 관계없이 식의 결과 값은 double 타입이다.

다음 실습창을 통해서 산술식에 관하여 실습한다.

 

3. 정수 나눗셈과 나머지 연산자

산술 식에서 두 개의 피연산자가 정수이면 그 결과 값도 정수라는 것을 앞 절에서 살펴보았다. 나눗셈 산술식은 산술식의 유형에 따라서 다른 결과를 가질 수 있다. 다음 예를 살펴보자.

           7/2

위 연산의 결과는 2개의 피연산자가 정수이므로, 그 결과 값도 정수이다. 따라서 그 결과 값은 3이고, 나머지는 항상 제거된다.

여러분이 위의 식에 대해서 수학적으로 정확한 값을 얻고자 한다면, 그 결과 값은 실수여야 한다. 결과 값을 실수로 얻기 위해서는 두 개의 피연산자 중에서 적어도 한 개는 실수여야 한다. 다음 3개의 연산은 실수 값 3.5를 생성한다.

              7.0/2

            7/2.0

            7.0/2.0

 

두 정수의 나눗셈 결과로 그 나머지를 계산할 필요가 있다. C 언어는 나머지를 계산하는 산술 연산자 %를 제공한다. 이 연산자는 두 개의 피연산자가 정수여야 한다. 연산의 결과는 첫 번째 피연산자가 두 번째 피연산자에 의해서 나누어질 때, 그 나머지 값을 생성한다.



다음은 % 연산자의 사용 예이다.

 

       0 % 5 = 0

       4 % 5 = 4

       33 % 5 = 5

1 % 5 = 1

20 % 5 = 0

2002 % 5 = 2

% 연산자는 흔히 한 수가 다른 수로 나누어지는지를 판단하는 용도로 많이 사용된다. 가령, n이 4로 나누어지는가를 판단하기 위해서, 여러분은 n%4의 결과 값이 0인지를 판단하면 된다.

다음 실습창을 통해서 정수 나눗셈과 나머지 연산자에 관하여 실습한다.

 

4. 연산자 우선순위

산술식이 한 개 이상의 연산자를 포함할 수 있다. 이때 어느 연산자가 먼저 적용될 것인지를 아는 것이 중요하다. 여러분은 괄호를 사용하여 연산자 적용 우선 순서를 명시할 수 있다. 즉, 괄호 안의 부분 식이 먼저 평가된다.

다음은 괄호를 사용하는 식의 예이다.

           (3+10) * 4

위의 식에서 괄호 안의 식이 먼저 평가된다. 따라서 덧셈이 먼저 적용되고, 다음에 곱셈이 적용된다.



위의 식에서 다음과 같이 괄호를 제거한다면 어떻게 될까?

       3 + 10 * 4

두 개의 연산자 중에서 어느 연산자를 먼저 적용할 것인가?

C 언어는 식에 여러 개의 연산자가 포함되어 있을 때, 연산자의 적용 순서를 결정할 수 있는 규칙들을 제공한다. 이러한 규칙을 연산자 우선순위(operator precedence)라 한다.

다음은 산술식에서 C가 제공하는 연산자 우선순위 규칙이다.

      우선순위 규칙    
   

1. 단항 연산자를 먼저 적용한다.

2. 다음에 *, /, % 연산자를 적용한다.

3. 다음에, +, - 연산자를 적용한다.

 
       

따라서 연산자 우선순위는 단항 연산자가 가장 높고, +, - 연산자가 가장 낮다.

다음은 3 + 10 * 4 의 식 평가 과정을 보여준다.

동일 수준의 연산자가 여러 개 포함되어 있을 경우에는 왼쪽에 위치한 연산자를 먼저 적용한다. 이것을
결합법칙(associativity)이라 한다.

가령, 다음 산술 식에서

            2 * 3 + 4 * 5

왼쪽에 위치한 *이 먼저 적용되고, 오른쪽에 위치한 *이 두 번째로 적용되고, 마지막으로 +가 적용된다.

위의 산술 식에서 곱셈보다 덧셈을 먼저 적용하려면, 다음과 같이 괄호를 사용하여 그렇게 할 수 있다.

              2 * (3 + 4) * 5

이제 위 식의 결과 값은 70이다.

다음 식을 생각해보자.

               10 - 4 - 3

결합법칙에 따라서, 왼쪽 -가 먼저 적용되고, 다음에 오른쪽 -가 적용된다. 그 결과 값은 3이다.

그러나 다음과 같이 괄호를 사용하여 오른쪽 -를 먼저 적용할 수 있다. 그 결과 값은 이제 9이다.

              10 - (4 - 3)

위에서 살펴보았듯이, 식에 연산자가 여러 개 포함될 경우에 어느 연산자를 먼저 적용하느냐에 따라서 식의 결과 값이 달라지는 것을 알 수 있다.

여러분은 연산자 우선순위와 결합법칙을 정확히 이해하고, 요구하는 결과 값을 얻을 수 있도록 식을 작성하는 것이 매우 중요하다.

다음 실습창을 통해서 연산자 우선순위에 관하여 실습한다.

 

 

5. 연산자 우선순위 규칙 적용

앞 절에서 다룬 연산자 우선순위 규칙을 적용하여 여러 개의 연산자가 포함된 식을 평가해보자. 다음 식을 생각해보자.

                7 - 4 / 3 + 5 * 2

연산자 우선순위와 결합 법칙에 따라서 연산자 적용 순서는 다음과 같이 결정된다 :    /, *, -, +.  

-, +와 /, *는 각각 우선순위가 같지만 결합법칙에 따라서 왼쪽에 위치한 -와 /가 각각 다른 연산자보다 먼저 적용된다.

다음은 위 식의 평가 과정을 보여준다.

약간 더 복잡한 다음 식을 생각해 보자.

              2 + 5 * ( 3 - 25 % 4 ) - 3 / 2

괄호 안의 부분 식이 가장 먼저 평가되므로, 괄호 안의 %, -가 순서대로 적용되고, 다음에 *, /, +, -가 순서대로 적용된다.

다음은 위 식의 평가 과정을 보여준다.

다음 실습창을 통해서 임의의 산술 식을 작성하고 평가한다.

top으로... 이전페이지로.. home으로..

top으로... 이전페이지로.. home으로..

  

6. 타입 변환

이미 살펴보았듯이, 혼합형 산술 식은 서로 다른 타입의 피연산자를 갖는다. 이 경우에, C 컴파일러는 한 피연산자의 타입이 다른 피연산자의 타입으로 자동으로 변환하여 두 피연산자의 타입을 일치시킨다. 이러한 타입 변환을 자동 타입 변환이라 한다.

다음 식은 혼합형 산술 식이다.

               3 + 2. 5

이 산술 식이 평가될 때, 먼저 3이 double 실수 3.0으로 자동으로 타입 변환되고, 다음에 연산자가 적용된다.


위에서와 같이 혼합형 산술 식에서 한 피연산자가 정수이고, 다른 피연산자가 실수일 때, 정수 타입 피연산자는 먼저 실수 타입 피연산자 타입으로 자동 변환된다.

일반적으로, 자동 타입변환은 기억공간의 크기가 작은 타입에서 기억공간의 크기가 더 큰 타입으로 변환된다.

C 언어에서, 보통 int 정수는 4바이트에 저장되고, double 실수는 8바이트에 저장된다. 따라서 int 타입이 double 타입으로 변환된다.


7. 배정문과 타입변환

자동 타입변환은 배정문에서도 발생할 수 있다. 다음 배정문을 생각해보자.

          double sum;
        ...
        sum = 0;

위의 배정문에서, 0의 값이 sum의 변수에 저장된다. 그러나 0은 int 값이고, sum은 double 변수이다.
이때 0 이 double 타입으로 자동 변환되고, 변환된 값 0.0 이 sum에 저장된다.


0과 0.0은 수학적으로 다르다는 것에 유의하라. 0은 정확히 0을 의미하지만, 0.0은 단지 0에 가까운 그 근사 값을 의미한다. 또한 이 두 수는 컴퓨터 내부에서 다르게 표현된다.


배정문에서 자동 타입변환이 발생하는 다른 유형을 생각해보자.

          int n;
        ....
        n = 2.345;

위의 배정문에서, 2.345의 값이 n의 변수에 저장된다. 그러나 2.345는 double 타입이고, n은 int 타입이다. 이때 2.345가 int 타입으로 자동 변환되고, 변환된 값 2가 int에 저장된다.

위 배정문의 수행 결과로, 소수점 이하 부분이 잘리게 된다. 이것은 정보의 손실을 초래한다. 따라서 이러한 배정문에 대해서 주의깊게 사용해야 한다.

다음 실습창을 통해서 배정문과 타입변환에 관하여 실습한다.

 

 

 

8. 타입 캐스트

C 언어는 여러분이 주어진 값을 원하는 타입으로 변환시킬 수 있는 방법을 제공한다. 이것은 타입 캐스트(type cast)라는 단항 연산자에 의해서 수행된다.

다음은 타입 캐스트의 사용 예이다. 여기서 n이 int 타입 변수라고 가정한다.

         (double) n

위에서 타입 캐스트 적용 결과로, n의 값은 double 타입으로 변환된다.

다음 코드는 n개의 수를 더해서 평균값을 계산하는 프로그램의 일부이다.

       
 

     int n, sum;
      double average;
      /* n개의 수를 더한다 */
      .....
      /* 평균값을 계산한다. */
      average = sum / n;
      ...

 
     

average는 여러분이 원하는 평균값을 갖는가? 이미 살펴보았듯이, sum과 n이 int 변수이므로, / 연산자 적용 결과도 int 값이다. 따라서 소수점 이하 부분은 잘려나간다. 이 int 값이 double 타입으로 자동 변환되어 average에 저장된다.

여러분이 소수점 이하 수치가 포함된 평균값을 원했다면, average에는 잘못된 값이 저장되어 있는 것이다. 이로 인해 프로그램 실행 결과는 여러분이 원하지 않은 것일 수 있다.

위의 문제는 다음과 같이 배정문을 수정하여 해결할 수 있다.

              average = (double) sum / n;

타입 캐스트가 단항 연산자이므로, 이항 연산자인 / 보다 우선순위가 높다. 따라서 sum의 값 타입이 먼저 double로 변환되고, / 연산자가 적용된다. 마지막으로 그 결과 값이 average에 저장된다.


다음 실습창을 통해서 타입 캐스트에 관하여 실습한다.

top으로... 이전페이지로.. home으로..

top으로... 이전페이지로.. home으로..