[C언어-막코딩] 6장 증감 연산자
- 다운 사이트 : https://sourceforge.net/projects/orwelldevcpp/
- 웹컴파일러 : https://www.tutorialspoint.com/compile_c_online.php
증가(++), 감소(--)연산자에 대해 오늘을 이야기를 할까 합니다. 이 증감연산자는 예전에 공무원 시험에 단골 주제로 나왔던 시험문제이고 컴퓨터 관련 자격증 시험에서도 필기로 자주 출체되는 문제였습니다. 증감 연산자는 어렵지 않지만 혼동을 야기하는 주제로 실수로 틀리는 경우가 많습니다. 왜! 혼동을 많이 하는지 알아 봅시다.
1. 증감 연산자
- ++ : 증가한다.
- -- : 감소한다.
무지 간단한 연산자입니다.
a=1 일때
s= 1 + (a++);
이렇게 하면 s은 값? s은 2가 됩니다.
s = 1 + (++a);
이렇게 하면 s은 값? s은 3이 됩니다.
즉, ++a의 경우 a를 먼저 증가 한 다음 산술 연산에 대입하고 a++의 경우 a를 먼저 산술 연산대입하고 나중에 증가합니다.
a=1;
s = 1 + (a++); => 1+1
s = 1 + (++a); => 1+2
어떤 의미인지 아히겠지요. 감소의 경우도 마찬가지 입니다.
b=1;
s = 1 + (b--); => 1+1
s = 1 + (--b); => 1+0
어렵지 않죠. 그러면 눈으로 확인하기 위해 코딩을 해 봅시다.
[코딩]
#include <stdio.h>
int main(int argc, char *argv[]) {
int a=1;
int b=1;
printf("a = %d\n",a);
printf("b = %d\n",b);
printf("a++ = %d\n",a++);
printf("++b = %d\n",++b);
return 0;
}
[결과]
증가 연산의 결과입니다. 여러분드은 감소 연산으로 수정해서 코딩해 보세요.
어렵지 않고 혼동 될 이이 없는데 이게 과거 공무원 시험의 단골 문제였다고 생각하시면 의아해 하실 거에요. 이제 그 이유를 살펴 보겠습니다.
2. 증감연산자 혼동되는 이유
[소스]
#include <stdio.h>
int main(int argc, char *argv[]) {
int a=1;
int b=1;
printf("a = %d\n",a);
printf("a++ = %d\n",a++);
printf("++a = %d\n",++a);
printf("b = %d\n",b);
printf("b++ = %d, ++b = %d\n",b++,++b);
return 0;
}
이렇게 하면 어떤 결과가 나올까요. 우선 머리속으로 계산해보세요.
[결과]
이렇게 결과가 나왔나요. 처음 증감연산자를 쓰시는 분들은 위와 같은 결과가 나온 이유를 좀 햇갈려 하실 거에요.
a는 좀 자세히 결과를 보시면 저렇게 증가하는 거구나 하겠지만 b은 전혀 이해가 되지 않을 거에요.
b의 경우는 printf()함수는 컴파일 시 뒤에서부터 진행 합니다. 증감연산자는 뒤에서 부터 시작하는 것이죠. 그래서 b의 증가가 먼저 오른쪽 부터 증가합니다. 그리고 대입은 순서대로겠죠.
b++, ++b 로 있을 때 ++b가 먼저 증가 한뒤에 b++을 하기 때문에 b의 현재 위치는 2가 됩니다. 그리고 b++임으로 2가 먼저 대입한 뒤에 증가하기 때문에 두번째 b의 값은 3인 된 상태로 대입이 됩니다. 제가 설명을 하면서도 좀 그렇네요. 아무튼 이 부분은 컴파일러에 따라서 약간 차이가 있습니다. 그래서 증감연산자를 사용할 때는 사용하시는 컴파일러에 먼저 데모 예제로 결과를 확인하시고 사용하셔서 혼동하거나 오류 코딩을 줄일 수 있습니다.
다음 코딩은 어떤 결과를 얻을 까요.
[소스]
#include <stdio.h>
int main(int argc, char *argv[]) {
int a=1;
int b=1;
printf("a++ : %d %d %d %d %d\n",a++,a++,a++,a++,a++);
printf("++b : %d %d %d %d %d\n",++b,++b,++b,++b,++b);
return 0;
}
a,b를 5번 연속으로 증가 시켰을 때 결과가 어떻게 나올까요. 한번 메모장에다 숫자를 적어 보세요.
[결과]
정답을 맞추셨나요. printf()함수는 오른쪽에서 부터 왼쪽 순이라고 했죠. a은 순차적으로 증가하는데 왼쪽 첫번째 순으로 숫자를 보면 54321 이렇게 대입되겠죠.
b의 경우는 먼저 증가하기 때문에 왼쪽 최종 첫번째 값은 6이 됩니다. 대입을 순차적으로 하면 전부 6의 값이 됩니다.
즉, 연산은 ++이 뒤에 붙으면 먼저 처리 연산에 먼저 대입 한뒤에 1을 증가하는 거고 ++이 앞에 붙으면 1을 증가 한 뒤에 나중에 처리 연산에 대입한 다는 개념을 가지고 있으면 위 결과가 이해가 되실 거에요.
마무리
여러개의 복합적 증감 연산을 붙여서 코딩을 해보세요.
int a=1;
int s;
s = a++ + a++ + ++a;
s의 값은 몇일까요. 맞춰보세요. 답은 7입니다. 왜! 7인지 맞추신다면 증감연산자를 이해하신 겁니다. 위 코딩을 printf()함수로 s값을 출력하면 7이 그냥 나오지만 이 7이 어떻게 나오는지 메모장에다 적으면서 풀어 보세요.
7이 나오는 이유를 알면 증감연산자를 이해 하신 겁니다.
좋은 아침. 저는 코박봇 입니다.
업보트 합니다 :)
감사합니다.
이런식으로 코드는 정말 헷갈리네요.
s = 1 + (a++); => 1+1 s = 1 + (++a); => 1+2
정말 시험에 나오면 실수 많이 할 것 같습니다.
그리고 응용하면 유지보수하기 어려운 코드도 만들 수 있을것 같아요. ㅋㅋ
과거 단골 문제였지요.
의외로 많이 틀림! ^^