
WHY?
for문의 증감식에서 증감 연산자를 사용할 때 전위 증감 연산자를 사용하든 후위 증감 연산자를 사용하든 for문의 결과값에는 차이점이 없었다.
결과값에 차이가 없으면 for문의 증감식에 전위, 후위 증감 연산자의 차이는 없는건지, 아무거나 사용해도 되는지에 대한 궁금증이 생겼다.
for문에서 전위, 후위 증감 연산자의 차이
for문의 기본 구성은 아래 코드와 같다.
for (초기화식; 조건식; 증감식)
{
(실행할 코드)
}
여기서 우리가 생각해 볼 부분은 증감식이다.
#include <stdio.h>
int main(void)
{
for (int i = 1; i <= 5; ++i)
{
printf("%d", i);
}
for (int j = 1; j <= 5; j++)
{
printf("%d", j);
}
return 0;
}
위 코드의 2개의 for문의 증감식에서 하나는 전위 증감 연산자를 사용하고, 다른 하나는 후위 증감 연산자를 사용한다.
하지만 두 for문은 같은 결과값을 출력한다.
위에서 전위, 후위 증감 연산자의 차이를 알아봤는데, 왜 두 for문은 같은 값을 출력하는 걸까?
그 이유는 for문의 동작 순서를 알아야한다.
for문의 동작 순서
C 언어에서 for문의 동작 순서는 다음과 같다.
- 초기화식
- 조건식
- 조건식이 참이면 실행할 코드를 실행
- 증감식
- 조건식
- 조건식이 거짓이라서 for문을 탈출 함
for문의 동작 순서를 보면 각각의 식는 그 식를 전부 진행해야 다음 식로 넘어간다. 예를 들어 초기화식을 전부 실행 후에 다음 조건식으로 넘어가지 초기화식의 일부만 실행하고 조건식으로 넘어가지 않는다는 것이다.
그렇기 때문에 증감식에서 전위 증감 연산자이든 후위 증감 연산자이든 증감식을 전부 실행 후에 다른 식으로 넘어가면 전위, 후위 차이가 존재하지 않는다.
전위 증감 연산자 순서
i = i + 1
i = i
후위 증감 연산자 순서
j = j
j = j + 1
위 코드를 보면 분명 전위, 후위의 순서의 차이는 존재하지만 전위든 후위든 코드를 마친다면 결과값은 같다.
결국 단독 문장으로 전위, 후위 증감 연산자를 사용하면 차이점이 아예 없는걸까?
단독 문장에서의 전위, 후위 증감 연산자의 차이점
결론부터 말하면 차이점이 있지만 차이점이 없다.
말에 모순이 있지만 이후 설명을 들으면 이해할 수 있다.
int a = 0; int b = 2;
a = b++;
위의 코드가 있을 때
a = b++ 라는 식이 있다면 b 가 1 증가되기 전의 값을 a 에게 넘겨주죠! b 의 초기값이 2 였다면 a 는 2 가 되고 b 는 3 이 될 것입니다. b++ 같은 후위증감연산자가 동작되는 원리는
1️⃣시스템 내부적으로 "임시 객체"가 만들어지고 이 곳에 1 증가되기 전의 기존 값을 복사해 할당합니다. 즉 b와는 별개인, b 가 1 증가되기 전의 값을 가진 "사본"이 만들어지는 것이죠. 그리고 기존 값을 가지고 있는 이 사본을 반환합니다.
2️⃣ 그리고 나서 원본인 b 를 1 증가시킵니다.
이와 같은 원리로 진행이 됩니다. 즉, b가 원래 가지고 있던 값인 2가 어떤 임시 객체에 복사되고 이 임시 객체를 반환하게 되므로 이 임시 객체가 a 에 할당되는 셈입니다. 그래서 a 가 b 의 증가되기 전의 값을 할당 받게 되는 것이에요. 원본 b 는 1 증가되구요!
이와 달리 ++b 전위증감 연산자는 기존값을 사본으로 만들어 이를 반환하고 뭐 이런 과정 없이 그냥 원본을 바로 1 증가시켜버리고 이 원본을 리턴하기 때문에 여전히 원본 b 그 자체입니다.
결국, 후위 증감 연산자는 연산과정에서 "사본"을 만들어서 반환하기 때문에 전위 증감 연산자보다 속도가 느리다. 그렇기에 전위, 후위 증감 연산자에는 차이점이 존재한다고 할 수 있다.
하지만, 요즘에는 컴파일러가 발전해서 for문의 증감식같은 단독 문장에서의 처리는 후위 증감 연산자도 전위 증감 연산자처럼 처리하기 때문에 속도가 똑같다.
이러한 이유로 속도의 차이가 있었으나 현재에는 같이 때문에 전위, 후위 증감 연산자의 속도의 차이는 없다고 생각하면 된다.
결론
for문의 증감식에서 전위 증감 연산자를 사용하든 후위 증감 연산자를 사용하든 차이는 전혀 없다.
여러 사람이 함께하는 프로젝트의 경우에는 서로 통일시켜서 사용하는 편히 좋다고 생각하고, 혼자서 코드를 작성한다면 일관성있게 사용하던 방법을 계속 사용하면 된다.
참고
전위, 후위의 속도가 차이나는 이유
https://www.inflearn.com/questions/108838
전위, 후위의 처리과정이 같다
http://1st.gamecodi.com/board/zboard.php?id=GAMECODI_Talkdev&no=1504
'프로그래밍 언어 > C' 카테고리의 다른 글
[C 언어] 증감 연산자 (0) | 2022.06.11 |
---|