| 제목 | 답변완료 ++연산자 질문 | ||
|---|---|---|---|
| 질문유형 | 강좌내용 | 교수님 | 장윤경 |
| 과목 | 프로그래밍(C언어) | 강좌명 | [프로그래밍(C언어)] 실습으로 이해하는 프로그래밍 첫걸음 : C언어 |
| 작성자 | 김*환 (g*****s) | 등록일 | 2026-03-16 19:51 |
| 첨부파일 | |||
|
안녕하세요 교수님, 첨부한 사진에서 세 출력값이 모두 12이어야 할 것 같은데 왜 중간 값이 13이 나오는지 이해되지 않습니다. 설명 부탁드립니다. 답변 완료된 질문과 답변은 수정 및 삭제가 불가합니다. |
|||
- 댓글
- 0
제시해주신 코드는 C언어에서 가장 악명 높은 함정 중 하나인 "정의되지 않은 행동(Undefined Behavior)"과 관련된 문제입니다.수학적으로나 직관적으로 생각하면 세 연산 모두 5++ + ++5 형태를 취하고 있어서 같은 값이 나와야 할 것 같지만, 중간 식만 13이 나오는 이유를 명쾌하게 정리해 드리겠습니다.
하나의 수식(시퀀스 포인트 사이) 안에서 동일한 변수의 값을 두 번 이상 변경하거나, 변경하면서 동시에 참조하는 행위는 표준에서 결과를 보장하지 않는 Undefined Behavior(정의되지 않은 행동)로 규정되어 있습니다.즉, c = c++ + ++c; 같은 코드는 C언어 표준 관점에서는 "어떻게 작동할지 컴파일러 마음대로 하라"고 방치한 코드입니다. GCC, Clang, MSVC(Visual Studio) 등 어떤 컴파일러를 쓰느냐, 혹은 최적화 옵션을 어떻게 주느냐에 따라 12가 나올 수도, 13이 나올 수도, 혹은 전혀 다른 값이 나올 수도 있습니다.
Visual Studio 컴파일러(MSVC)는 왜 13을 만들었을까?Visual Studio의 디버그 모드가 내부적으로 이 수식을 어떤 순서(어셈블리 명령문 생성 순서)로 처리했는지 따라가 보면 13이 나온 이유를 역추적할 수 있습니다.c = c++ + ++c; 의 컴파일러 해석 순서초기 상태: c = 5;우변의 ++c (전위 증가) 우선 처리:c를 먼저 1 증가시킵니다. c는 6이 됩니다.이 자리에 평가된 값은 변경된 후의 값인 6이 들어갑니다.우변의 c++ (후위 증가) 처리:후위 증가는 연산 당시에는 원래 값을 반환하므로, 현재 c인 6을 이 자리에 대입합니다.그리고 내부적으로 '나중에 수식이 끝나면 c를 1 증가시켜야지' 하고 예약(메모리 대기)을 걸어둡니다.덧셈 수행:c++ 자리에서 가져온 6과 ++c 자리에서 가져온 6을 더합니다.6 + 6 = 12 가 됩니다.대입 연산 (=) 수행:우변의 결과물인 12를 좌변의 변수 c에 대입합니다. c는 12가 됩니다.후위 증가(c++)의 최종 반영 (부작용, Side Effect):3번 단계에서 예약해 두었던 "수식이 끝날 때 c를 1 증가시킨다"는 명령이 수행됩니다.현재 c가 12인 상태에서 1이 더해지므로, 최종적으로 c는 13이 됩니다.
첫 번째: printf("%d\n", c++ + ++c);위의 1~4번 과정까지는 동일하게 진행되어 6 + 6 = 12 결과값이 printf 함수로 바로 전달되어 12가 출력됩니다.출력이 끝난 직후(시퀀스 포인트 이후)에 c++에 의한 후위 증가가 반영되어 메모리 상의 c는 13이 되지만, 이미 출력은 12로 끝난 상황입니다.
세 번째: int a = c++ + ++c;역시 우변 연산 결과는 12가 됩니다.이 12라는 값이 새로운 변수 a에 대입되므로 a는 12가 확정됩니다.그 이후 원래 변수였던 c가 후위 증가에 의해 13으로 변하지만, 출력하는 값은 a이므로 12가 나옵니다.
- 2026-06-09
- 2026-06-09 수정























