Q

 

int num1 = 1;

num1 = num1++ + ++num1;

printf("%d",num1);

이거 답이 5래요.. 근데 왜 5가 나오는지 모르겠어요..

 

 

A

 

num1이 1일 때 ++num1은 수식을 계산하기 전에 num1에 1을 더하라는 말입니다.

 

num1++은 모든 계산이 끝나고 num1에 1을 더하라는 뜻입니다.

 

즉, 수식은 num1 = num1++ + ++num1 이지만 계산 순서는 num1 = ++num1 + num1++ 에 가깝죠.

 

num1 = ++num1(num1+1) + num1++ 이면 ++num1(num1+1)은 1이 아니라 2가 되는 겁니다.

 

num1 = 2 + num1++ 이지만 사실상은 num1 = 2 + 2++ 인거죠.

 

계산하면 num1 = 4++입니다.

 

모든 계산이 끝났으니까 4뒤에 붙은 ++을 계산해줍니다.

 

num1 = 5. 따라서 출력값은 5가 됩니다.

 

이런 코드 시험에서나 나오지 실제 코딩할때는 안나옵니다.

 

===

 

내가 이해하여 다시 써보는 답변:

 

num1 = num1++ + ++num1;

 

저 코드를 디버깅 중이라고 치자.

 

프로그램이 이 코드를 실행하려는 중일 때

 

(프로그램의 실행 단계가 저 코드에 다다랐다는 뜻임)

( -> num1 = num1++ + ++num1; )

 

프로시저 단위 실행을 수행하면 num1 = num1++ + ++num1; <- 이 코드는 실행될 것이다.

 

 

저 코드가 실행되는 과정 :

 

전위형증감연산자(++num1)가 후위형증감연산자(num1++)보다 연산 우선순위가 높으므로

 

후위증감연산자보다 먼저 연산이 수행됨.

 

그렇게 되면 num1은 2가 된다.

 

근데 위에서 int num1 = 1; 라고 초기화 한 num1이라는 식별자의 값이 바뀌어 버리는 것이다.

 

마치 타임머신을 타고 내일로 갔는데 책상에 타임머신을 타기 전부터 있던 과자를 다 먹고 다시 과거로 돌아갔을 때

책상엔 다 먹은 과자봉지만 있는 것 마냥 과거가 바뀌어버리는 느낌이랄까

 

어쨋든 그렇게 되면 

 

num1 = 1++ + ++1;  이었는데

 

num1 = 2++ + 2; 가 됐다는 것이다.

 

덧셈 연산자는 후위형 증감연산자보다 연산 우선순위가 높으므로

 

연산은 2+2가 되어  num1 = 4++; 가 된다.

 

이 코드의 실행은 여기까지이다. 저 후위형증감연산자가 실력발휘를 하려면 프로그램 실행 흐름이 다음 줄로 넘어가야 한다.

 

===

 

근데 여기까지 글을 썼을 때 저 후위연산자의 연산은 과연 다음 행에서 이루어지는가에 대해서 회의감이 들었고

 

검색해보니..

 

단순히 "전위 연산자는 즉시 값을 증감 시키고, 후위 연산자는 다음 행에서 값을 증감시킨다" 라고 잘못 알고 있는 경우가 있는데 내부를 살펴보면 사실 전위 연산자든 후위 연산자든 값의 증감은 즉시 이루어진다.
즉 차이는 반환할 때 발생한다. 전위 연산자는 증감된 값을 참조형으로 반환하지만 후위 연산자는 값은 증가시키지만 증감 전의 값을 임시 객체로 만들어서 반환한다. 그래서 증감된 값은 다음 행에서야 사용할 수 있는 것이다.


출처: https://spenshi.tistory.com/entry/증감-연산자-오버로딩 [Maniac] 

 

 

그렇다고 한다.

 

 

아직

전위 연산자는 증감된 값을 참조형으로 반환하지만 후위 연산자는 값은 증가시키지만 증감 전의 값을 임시 객체로 만들어서 반환한다.   

 

이 말의 뜻을 모르겠지만 언젠가는 알게 되지 않을까.

 

====

외면받고 있는 증감 연산자...

TMI이지만, 증감 연산자인 increment ++와 decrement --에 대해 조사하던 중
eslint가 증감 연산자를 썩 반기지 않는다는 사실을 알게 되었다.

  • ++ and -- operators are subject to automatic semicolon insertion, differences in whitespace can change semantics of source code.
  • 출처: no-plusplus | eslint

증감 연산자는 자동으로 세미콜론;이 추가되는 대상이 되어서
예상치 못하게 코드의 흐름을 변경시키며, 의도하지 않은 값의 증가, 감소를 일으키는 등
애플리케이션 내에서 예상치 못한 에러를 발생시킬 가능성이 있다...고 한다.

그리고 증감 연산자에 능숙하지 않은 사람에게
연산이 먼저인지, 할당이 먼저인지 파악하는 것이 번거롭기 때문에
증감 연산자를 꺼려하는 개발자들도 있는 듯하다.
(출처: Why avoid increment (“++”) and decrement (“--”) operators in JavaScript? - Stack Overflow)

eslint에서는 증감 연산자의 대안책으로 복합 대입 연산자를 제안하고 있다.

복합 대입 연산자

+=, -=를 사용하면 예상치 못한 값의 증가, 감소와 같은 현상을 막을 수 있다...고 한다.

 

출처 :  JavaScript :: 증감 연산자(++, --) Feat. 전위 연산자, 후위 연산자 (velog.io)

+ Recent posts