|
||||||||||||||||||||||||||||||||||||||||||||||||
여러분이 어떤 계산을 수행하고자 할 때, 보통 식을
작성하여 그렇게 한다. C 언어에서 산술 연산은 산술식으로 표현된다.
위에서 a, b를 피연산자(operand)라
하고, +는 연산자(operator)라
한다.
다음은 산술 식의 예이다.
산술 식은 다음과 같이 피연산자로 변수를 포함할 수 있다.
이 경우, 왼쪽 피연산자의 값은 x에 저장된 값이다.
1. 연산자의 유형 수학에서와 마찬가지로, 연산자는 두 가지 형태일 수
있다. 단항
연산자와 이항
연산자.
단항 연산자는 피연산자를 단지 한 개만 가지며, 이항 연산자는 두 개의 피연산자를 갖는다. C 언어의 산술 연산자 모두 (+, -, *, /, %) 이항 연산자이다. 그러나 -는 또한 단항 연산자이다. 따라서 다음 식은 올바르다.
-가 이항 연산자인 경우에 그 의미는 뺄셈 연산자이지만,
단항 연산자인 경우에 그 의미는 피연산자의 값을 음수화시킨다. 따라서 x에 저장된 값이 5이면, -x의 값은 -5이다. 2. 산술식 유형 산술 식의 유형을 크게 다음과 같이 구분할 수 있다 : 정수형, 실수형, 혼합형.
정수형
식의 결과 값은 정수이고, 실수형과 혼합형 식의 결과 값은 실수이다.
다음 식을 생각해보자.
위에서 변수 n이 int 변수이면, 식의
결과 값은 정수이고, n의 타입이 double이면 식의 결과 값은 double 타입이다. 다른 식을 생각해보자.
이 경우, n이 int 또는 double 타입이든지 관계없이 식의 결과 값은 double 타입이다.
|
3. 정수 나눗셈과 나머지 연산자 산술 식에서 두 개의 피연산자가 정수이면 그 결과 값도 정수라는 것을 앞 절에서 살펴보았다. 나눗셈 산술식은 산술식의 유형에 따라서 다른 결과를 가질 수 있다. 다음 예를 살펴보자.
위 연산의 결과는 2개의 피연산자가 정수이므로, 그 결과 값도 정수이다. 따라서 그 결과 값은 3이고, 나머지는 항상 제거된다. 여러분이 위의 식에 대해서 수학적으로 정확한 값을 얻고자 한다면, 그 결과 값은 실수여야 한다. 결과 값을 실수로 얻기 위해서는 두 개의 피연산자 중에서 적어도 한 개는 실수여야 한다. 다음 3개의 연산은 실수 값 3.5를 생성한다.
두 정수의 나눗셈 결과로 그 나머지를 계산할 필요가 있다. C 언어는 나머지를 계산하는 산술 연산자 %를 제공한다. 이 연산자는 두 개의 피연산자가 정수여야 한다. 연산의 결과는 첫 번째 피연산자가 두 번째 피연산자에 의해서 나누어질 때, 그 나머지 값을 생성한다.
% 연산자는 흔히 한 수가 다른 수로 나누어지는지를 판단하는 용도로 많이 사용된다. 가령, n이 4로 나누어지는가를 판단하기 위해서, 여러분은 n%4의 결과 값이 0인지를 판단하면 된다.
|
4. 연산자 우선순위 산술식이 한 개 이상의 연산자를 포함할 수 있다. 이때 어느 연산자가 먼저 적용될 것인지를 아는 것이 중요하다. 여러분은 괄호를 사용하여 연산자 적용 우선 순서를 명시할 수 있다. 즉, 괄호 안의 부분 식이 먼저 평가된다. 다음은 괄호를 사용하는 식의 예이다.
위의 식에서 괄호 안의 식이 먼저 평가된다. 따라서 덧셈이 먼저 적용되고, 다음에 곱셈이 적용된다.
두 개의 연산자 중에서 어느 연산자를 먼저 적용할 것인가? C 언어는 식에 여러 개의 연산자가 포함되어 있을 때, 연산자의 적용 순서를 결정할 수 있는 규칙들을 제공한다. 이러한 규칙을 연산자 우선순위(operator precedence)라 한다. 다음은 산술식에서 C가 제공하는 연산자 우선순위 규칙이다.
따라서 연산자 우선순위는 단항 연산자가 가장 높고,
+, - 연산자가 가장 낮다. 다음은 3 + 10 * 4 의 식 평가
과정을 보여준다. 가령, 다음 산술 식에서
왼쪽에 위치한 *이 먼저 적용되고, 오른쪽에 위치한
*이 두 번째로 적용되고, 마지막으로 +가 적용된다.
이제 위 식의 결과 값은 70이다.
결합법칙에 따라서, 왼쪽 -가 먼저 적용되고, 다음에 오른쪽 -가 적용된다. 그 결과 값은 3이다. 그러나 다음과 같이 괄호를 사용하여 오른쪽 -를 먼저 적용할 수 있다. 그 결과 값은 이제 9이다.
위에서 살펴보았듯이, 식에 연산자가 여러 개 포함될 경우에 어느 연산자를 먼저 적용하느냐에 따라서 식의 결과 값이 달라지는 것을 알 수 있다. 여러분은 연산자 우선순위와 결합법칙을 정확히 이해하고,
요구하는 결과 값을 얻을 수 있도록 식을 작성하는 것이 매우 중요하다. |
5. 연산자 우선순위 규칙 적용 앞 절에서 다룬 연산자 우선순위 규칙을 적용하여 여러 개의 연산자가 포함된 식을 평가해보자. 다음 식을 생각해보자.
연산자 우선순위와 결합 법칙에 따라서 연산자 적용 순서는 다음과 같이 결정된다 : /, *, -, +. -, +와 /, *는 각각 우선순위가 같지만 결합법칙에 따라서 왼쪽에 위치한 -와 /가 각각 다른 연산자보다 먼저 적용된다. 다음은 위 식의 평가 과정을 보여준다.
괄호 안의 부분 식이 가장 먼저 평가되므로, 괄호 안의 %, -가 순서대로 적용되고, 다음에 *, /, +, -가 순서대로 적용된다. 다음은 위 식의 평가 과정을 보여준다.
|
6. 타입 변환 이미 살펴보았듯이, 혼합형 산술 식은 서로 다른 타입의 피연산자를 갖는다. 이 경우에, C 컴파일러는 한 피연산자의 타입이 다른 피연산자의 타입으로 자동으로 변환하여 두 피연산자의 타입을 일치시킨다. 이러한 타입 변환을 자동 타입 변환이라 한다. 다음 식은 혼합형 산술 식이다.
이 산술 식이 평가될 때, 먼저 3이 double 실수 3.0으로 자동으로 타입 변환되고, 다음에 연산자가 적용된다.
일반적으로, 자동 타입변환은 기억공간의 크기가 작은 타입에서 기억공간의 크기가 더 큰 타입으로 변환된다. C 언어에서, 보통 int 정수는 4바이트에 저장되고, double 실수는 8바이트에 저장된다. 따라서 int 타입이 double 타입으로 변환된다.
7. 배정문과 타입변환 자동 타입변환은 배정문에서도 발생할 수 있다. 다음 배정문을 생각해보자.
위의 배정문에서, 0의 값이 sum의 변수에 저장된다.
그러나 0은 int 값이고, sum은 double 변수이다.
위의 배정문에서, 2.345의 값이 n의 변수에 저장된다.
그러나 2.345는 double 타입이고, n은 int 타입이다. 이때 2.345가 int
타입으로 자동 변환되고, 변환된 값 2가 int에 저장된다.
|
8. 타입 캐스트 C 언어는 여러분이 주어진 값을 원하는 타입으로 변환시킬 수 있는 방법을 제공한다. 이것은 타입 캐스트(type cast)라는 단항 연산자에 의해서 수행된다. 다음은 타입 캐스트의 사용 예이다. 여기서 n이 int 타입 변수라고 가정한다.
위에서 타입 캐스트 적용 결과로, n의 값은 double
타입으로 변환된다.
average는 여러분이 원하는 평균값을 갖는가? 이미 살펴보았듯이, sum과 n이 int 변수이므로, / 연산자 적용 결과도 int 값이다. 따라서 소수점 이하 부분은 잘려나간다. 이 int 값이 double 타입으로 자동 변환되어 average에 저장된다. 여러분이 소수점 이하 수치가 포함된 평균값을 원했다면, average에는 잘못된 값이 저장되어 있는 것이다. 이로 인해 프로그램 실행 결과는 여러분이 원하지 않은 것일 수 있다. 위의 문제는 다음과 같이 배정문을 수정하여 해결할 수 있다.
타입 캐스트가 단항 연산자이므로, 이항 연산자인 / 보다 우선순위가 높다. 따라서 sum의 값 타입이 먼저 double로 변환되고, / 연산자가 적용된다. 마지막으로 그 결과 값이 average에 저장된다.
|
|
|