작은숲:위키노트/초보자를 위한 C 언어 강의/증가·감소 연산자: 두 판 사이의 차이
잔글 문자열 찾아 바꾸기 - "\[\[분류:공유(\|.*?)?\]\]" 문자열을 "분류:위키노트/공유$1" 문자열로 |
잔글 Utolee90님이 위키노트:초보자를 위한 C 언어 강의/증가·감소 연산자 문서를 넘겨주기를 만들지 않고 작은숲:위키노트/초보자를 위한 C 언어 강의/증가·감소 연산자 문서로 이동했습니다: 위키노트 문서 작은숲으로 이동 |
(차이 없음)
| |
2022년 5월 7일 (토) 19:24 기준 최신판
C 언어의 연산자 중에 재미있는 것이 증가·감소 연산자이다. 증가 연산자는 ++이라고 쓰고, 감소 연산자는 --이다. 증가 연산자는 피연산자의 값을 하나 증가시키는 역할을 하고, 감소 연산자는 값을 하나 감소시키는 역할을 한다. 즉, 다음과 같다.
i++; /* => i = i + 1; */
i--; /* => i = i - 1; */C 언어에 익숙한 사람들은 위의 예에서 나오는 뒤의 수식 대신 증가·감소 연산자를 많이 사용하는데 거기에는 이유가 있다.
- 증가·감소 연산자를 사용하게 되면 코드가 한결 간결해진다. 따라서, 가독성이 높아진다.
- 증가·감소 연산자는 실제로 기계어와 비슷한 형태이므로, 효율적으로 기계어 코드를 생성할 수 있다. 실제로 컴파일 후 실행 속도도 더 빠르다.
하지만, 이 증가·감수 연산자를 사용하는데는 한가지 골치 아픈 문제가 있다. 다름 아닌, 전위형이냐 후위형이냐에 따른 문제이다. 다음의 예를 보도록 하자.
a = ++b + c;
a = b++ + c;이 두 연산식은 같아 보인다. 다른 것이 있다면 증가 연산자가 b라는 변수 앞에 왔는냐, 뒤에 왔느냐는 것이 다르다. 증가·감소 연산자가 변수 앞에 오게 되면, 이것을 전위형이라고 부른다. 이렇게 전위형 연산자가 되면 b의 값을 연산식에 사용하기 전에 값을 증가시킨다. 반대로 변수 뒤에 오게 되면 후위형이라고 부르는데, 이렇게 후위형 연산자의 경우는 수식의 계산이 끝난 다음에 값을 증가시킨다. 즉, 전위형 연산자의 경우 아래와 같이 두 수식으로 쓸 수 있을 것입니다.
b = b + 1;
a = b + c;반대로 후위형 연산자는
a = b + c;
b = b + 1;이와 같이 전위형이냐 후위형이냐에 따라 수식의 연산 결과는 달라진다. 따라서, 전위형, 후위형을 적절하게 사용하는 것은 상당히 중요한 문제이다. 수식 내에서 전위형, 후위형 연산자를 잘못 사용했을 때는 컴파일러도 오류를 찾아주지를 못한다. 애상치 못한 심각한 버그가 될 수도 있다. 하나의 예를 보도록 하자.
void main()
{ int i = 1;
while (i <= 10) {
printf("%d\n", i);
i++;
}
}위의 예에서 i++; 는 ++i;라고 해도 똑같은 결과를 얻을 수 있다. 증가 연산자가 단독으로 쓰였기 때문이다. 하지만 아래의 예에서는 다른 결과를 보일 것이다.
void main()
{ int i = 1;
while (++i <= 10)
printf("%d\n", i);
}이와 같이 증가 연산자가 문장 내에서 사용됐다면 이것이 전위형인지 후위형인지에 따라 결과는 달라진다. 전위형으로 쓰였다면 2부터 출력되고, 반대로 후위형으로 쓰이면 1부터 출력이 된다. 또, 얼마까지 출력이 될 것인가도 달라진다. 한번 생각해보도록 하자. 아직 증가·감소 연산자에 익숙치 않다면, 증가·감소 연산자가 연산식 내에 나오면 그 문장을 여러 개의 문장으로 나눠서 생각해 보자. 이 방법은 증가·감소 연산자가 어떤 식으로 동작을 하는지 알 수 있도록 도와줄 것이다. 그리고 한가지 더! 아래 두 문장을 비교해보자.
printf("%d\n", a + 1);
printf("%d\n", a++);당연한 이야기이지만, 위 두 문장은 다르다. 저 두 문장을 각각 실행하고 난 다음의 a의 값은 어떻게 바뀔까? 처음 문장에서는 a의 값이 바뀌지 않지만, 두번째 문장에서는 a의 값이 1 증가된다. 즉, 출력되는 값은 같을 지 모르지만, 저 두 문장이 실행되고 난 다음에는 결과가 다르다. 가끔 이 부분을 혼동하는 경우도 있는데 증가·감소 연산자는 증가·감소한 값을 변수에 저장한다.