티스토리 뷰

증감연산자 계산 순서

C언어를 공부하다 신기한 것을 발견하였다.

#include <stdio.h> 
int main() 
{ int num = 10; 
  printf("%d %d", ++num, num++); 
  return 0; 
}

이 코드의 출력 결과값은 무엇이 나올것 같은가? 11, 11 이라고 말을 하는 사람이 대다수일 것이다. 그러나 정작 코드를 실행해보면 12, 10이 출력되게 된다. 아니 이게 무슨 일인가 전혀 예상치 못한 값이 두개나 나와버린다. 다소 놀라웠다. 12, 10이 출력되는 이유는 printf문이 Stack에 쌓여서 실행되기 때문이다. ++num이 먼저 들어가고, num++이 나중에 들어가게된다. Stack의 자료구조는 LIFO(Last In First Out)의 형태를 취하고 있다. 이에 마지막에 들어간 num++이 먼저 실행되어 12, 10이 출력된다. 쉽게 말해서 뒤에서 부터 실행되는 것이다.

자바도 똑같은 결과인지 궁금하여 실행해보았다.

public class Main{ 
    public static void main(String\[\] args){ 
    int num = 10; System.Out.printf("%d %d", ++num, num++); 
    } 
}

자바의 경우 11, 11이 출력되게 된다. 순차적으로 ++num, num++이 실행된것이다.

더 열심히 찾아본 결과 컴파일러와 JVM의 버전에 따라서 실행되는 순서가 다르다고 한다. 이에 하나의 출력문에 증감연산자를 여러개 쓰는 코딩 스타일은 지양해야할 것이다.

댓글