이번 포스팅에서는 C언어 또는 C++ 프로그램에 등장하는 변수들의 값을 바꾸기 위한 연산문들에 대해 알아봅시다. 여러 개의 연산문들을 순차적으로 실행함으로써, 궁극적으로는 원하는 기능을 구현하게 됩니다. 따라서 사칙연산을 포함한 여러가지 연산자들에 대해 친숙해지는 것은 프로그램을 작성하는 데 있어서 매우 중요하다고 볼 수 있습니다.
변수들을 C언어 프로그램에서 사용하기 위해서는 선언문을 통해서 이들의 존재를 먼저 알려야 합니다. 여러가지 자료형을 통해 다양한 형태의 데이터를 나타내는 변수들을 선언하는 방법에 대해서는 다음 포스팅에 더 자세한 내용이 소개되어 있습니다. 변수와 자료형의 개념이 생소하게 느껴지시는 분들에게 큰 도움이 되리라 생각합니다.
가장 먼저 변수의 값을 정의하기 위한 방법을 알아봅시다. 이를 위해서는 위해서는 등호 (=)를 사용해야 하는데요. 수학에서 등장하는 등식과의 차이에 대해 짚고 넘어갈 필요가 있습니다. 예컨대 a=b와 b=a는 수학적으로 동일하지만, C/C++ 프로그램에서는 다릅니다. 전자의 경우 변수 b에 저장된 값을 변수 a에 저장하라는 의미인 반면, 후자는 반대로 변수 a에 저장된 값을 변수 b에저장하라는 의미죠.
다음과 같이 여러 변수들을 선언하고 초기화한 다음, 서로 다른 변수들의 값을 동기화하는 경우를 생각해볼 수 있습니다.
int a, b, c;
a = 2;
b = 3;
c = 6;
a = b;
/* a = 3
* b = 3
* c = 6 */
b = c;
/* a = 3
* b = 6
* c = 6 */
c = a;
/* a = 3
* b = 6
* c = 3 */
수학에서 볼 수 있는 등식의 의미와는 달리, 등호의 좌측과 우측에 변수들이 들어가는 순서에 따라 그 값들이 달라지는 것을 볼 수 있습니다.
참고로 변수의 선언과 동시에 특정한 값을 가지도록 초기화하는 것도 가능합니다. 이를 위해서는 변수의 선언문에서 변수 이름 뒤에 등호를 사용해서 초기값을 지정해주면 되겠습니다. 앞의 예시에 나온 정수형변수 a, b, c에 대해서는 다음과 같이 선언할 수 있죠.
int a = 2;
int b = 3;
int c = 6;
그 다음으로 알아볼 것은 사칙연산 등을 통해 변수의 값을 바꾸는 방법입니다. 덧셈과 뺄셈은 수학에서와 동일한 + 및 - 연산자를 각각 사용하고, 곱셈과 나눗셈을 위해서는 * 및 / 연산자가 각각 사용됩니다. 정수의 나눗셈을 하는 경우, 정확히 말하자면 / 연산자는 나눗셈의 몫을 돌려줍니다. 반면에 나눗셈의 나머지를 얻기 위해서는 % 연산자를 사용할 수 있습니다.
int a = 10;
int b = 3;
int z;
z = a + b;
/* a 더하기 b
* z = 13 */
z = a - b;
/* a 빼기 b
* z = 7 */
z = a * b;
/* a 곱하기 b
* z = 30 */
z = a / b;
/* a 나누기 b의 몫
* z = 3 */
z = a % b;
/* a 나누기 b의 나머지
* z = 1 */
나눗셈 연산에 정수형 변수들을 그대로 가져다 쓰면 나눗셈의 몫을 돌려받기 때문에, 정수형 변수들의 나눗셈을 통해 유리수를 얻기 위해서는 실수형 변수로 형변환을 먼저 해 줘야 합니다. 예를 들어서 1/4 (4 분의 1)을 계산하기 위해서는 1과 4가 저장된 정수형 변수들을 먼저 float 혹은 double형으로 변환해줄 필요가 있겠죠. 그러면 0.25라는 값을 얻을 수 있게 됩니다.
int i_nomin = 1;
int i_denom = 4;
float ii_ratio;
ii_ratio =
(float)i_nomin / (float)i_denom;
// ii_ratio = 0.25
경우에 따라서는 변수의 기존 값에다가 다른 값을 더하는 등의 연산이 필요할 때가 있습니다. 예를 들어서 a의 기존 값에다가 b의 값을 더한 것을 다시 변수 a에 저장하려면 다음과 같은 연산문이 필요하겠죠.
a = a + b;
이렇게 하면 변수 b에 저장된 값은 그대로이지만, 변수 a에 저장된 값이 변하게 됩니다. 그리고 이 때는 다음과 같이 연산자 뒤에 등호를 붙여서 연산문을 단순화하는 것이 가능합니다.
a += b;
이렇게 하면 코드를 읽어보기도 쉽고, 실수를 할 가능성도 낮아지게 됩니다. 그리고 이는 덧셈뿐만 아니라 뺄셈, 곱셈 및 나눗셈 연산에도 동일하게 적용가능한 방법입니다.
하나의 연산문에 여러개의 연산이 포함되는 경우, 수학에서 쓰는 방식과 비슷하게 괄호를 사용해서 우선순위를 지정할 수 있습니다. 예를 들어서 (a + b) * c는 a 더하기 b에다가 c를 곱한 것이지만, a + (b * c)는 b 곱하기 c에다가 a를 더한 것이 되겠습니다.
마지막으로 정수형 변수의 증감 (increment, decrement) 연산자에 대해서도 알아두면 좋습니다. 두 개의 덧셈과 뺄셈 기호를 붙여서 ++ 및 -- 로 나타내며 대상이 되는 변수의 값을 1만큼 증가시키거나 감소시키는 연산자들인데요. 증감의 대상이 되는 변수에 앞에 연산자가 붙으면 전위 (pre-), 뒤에 붙으면 후위 (post-) 증감 연산자가 됩니다. 전위 증감연산자는 변수의 값을 먼저 바꾼 다음 이를 리턴하는 반면, 후위 증감연산자는 변수의 기존 값을 먼저 리턴한 다음 그 값을 바꾸게 됩니다.
간단한 예제 프로그램을 통해서 지금까지 알아본 사칙연산들을 실행해볼 수 있습니다.
C언어 소스 코드입니다.
#include<stdio.h>
int main(int argc, char *argv[]) {
printf("\n");
printf("Arithmetics in C\n");
printf("================\n");
printf("\n");
int a = 10;
int b = 3;
printf(" a = %d\n", a);
printf(" b = %d\n", b);
printf(" a + b = %d\n", a + b);
printf(" a - b = %d\n", a - b);
printf(" a * b = %d\n", a * b);
printf(" a / b = %d\n", a / b);
printf(" a %% b = %d\n", a % b);
printf("\n");
int aa;
a = 10;
printf(" a = %d\n", a);
// pre-increment operator
aa = ++a;
printf(" aa = ++a : a = %d, aa = %d\n",
a, aa);
// pre-decrement operator
a = 10;
aa = --a;
printf(" aa = --a : a = %d, aa = %d\n",
a, aa);
// post-increment operator
a = 10;
aa = a++;
printf(" aa = a++ : a = %d, aa = %d\n",
a, aa);
// post-decrement operator
a = 10;
aa = a--;
printf(" aa = a-- : a = %d, aa = %d\n",
a, aa);
printf("\n");
}
프로그램을 빌드하고 실행시켜보면 다음과 같은 결과를 볼 수 있습니다.
사칙연산의 결과와 더불어, 전위 및 후위 증감연산자들이 리턴하는 값이 달라지는 것도 확인이 가능하죠.
동일한 연산을 수행하는 기능을 반복적으로 사용해야 할 경우, 이를 함수로 정의해서 필요할때마다 호출하면 편리합니다. 함수를 구성하는 요소들과 함수를 어떻게 정의하는지에 대한 더 자세한 내용은 다음 포스팅에 소개되어 있습니다.
C언어나 C++ 소스 코드를 가지고 실행이 가능한 프로그램을 만드는 과정에 대해서는 다음 포스팅에 더 자세한 내용이 소개되어 있습니다.