작성
·
287
2
후위증가연산자 ++가 우선순위가 더 높아서
*start++ 가 *(start++)와 동일하다는 것은 알겠습니다.
하지만 이런식이라면 count라는 포인터변수에 ++ 라는 포인터 산술연산을 하고
dereferencing을 한다는 말인데
이것이 후위연산자라서 마치 dereferencing을 먼저하고 그 다음 더하는 것 같아서 헷갈립니다.
Operator precedence in C 를 보면 후위연산자가 제일 순위가 높던데
후위연산자를 보면 우선순위에 맞게 괄호를 넣은 것처럼 보면서 계산하고 계산이 모두 끝난 뒤 후위연산자를 적용하는 방식으로 바라보아야 하나요?
우선순위는 제일 높은데 정작 계산은 제일 나중에 되니 이해가 잘 안되네요.
답변 1
5
*(start++) 👉 이 표현은 start를 1 증가시키고 난 후 그 결과로 dereferencing 한다는 것이 아닙니다.
start++가 먼저 실행되더라도 dereferencing 간접 참조는 start의 증가되기 전의 기존값으로 하게 됩니다. 그 이유는 아래부터 설명드릴게요!
✨후위 증가 연산자가 하는 일
1. 먼저 기존의 값을 복사하여 임시 객체에 담고 이를 리턴한다. (Because a temporary copy of the object is constructed during post-increment and post-decrement, pre-increment or pre-decrement operators are usually more efficient in contexts where the returned value is not used. 출처링크)
2. 그리고 나서야 원본에 대해 1 증가 연산을 한다.
후위 증가 연산자가 우선순위가 더 높다는 의미는 1 증가시킨 연산 결과를 우선적으로 받는다는 의미가 아닙니다. 즉, start가 1 증가된 결과값을 * 간접참조 하게된다는 의미가 아니에요. 위 1,2 일련의 전체 과정을 먼저 해준다는 뜻입니다. 후위 증가 연산자는 시스템 내부적으로 기존의 값을 복사하여 사본을 임시적으로 만들어 놓고 그 후에 원본을 1 증가시키는 과정을 거칩니다. 이 후위 연산의 결과를 피연산자로 쓰는 다른 연산자에선 기존값을 보관중인 이 임시로 만든 사본을 리턴받아 이걸 가지고 연산하게 되요.
(+ 덧붙여서 전위 증가 연산자는 기존 값 복사해둘 사본이 필요 없어서 그냥 바로 원본을 증가시켜버리고 이를 리턴합니다.)
*start++ 이 과정을 자세히 설명 드리자면, 우선 후위 증가연산자가 우선순위가 더 높으므로 start++가 먼저 실행이 됩니다. start의 기존 값을 복사하여 임시 사본을 만들고 리턴합니다. 그리고 원본 start가 1 증가됩니다. 이제 *start 가 실행될 차례입니다. 실제 start 원본은 1 증가되었지만 * 연산자는 start가 증가되기 전에 기존의 start 값을 복사해서 만들어지고 리턴된 사본을 간접참조 하게 됩니다.
- ptr_a 변수(포인터)의 초기값은 a 의 주소값(010FFDF"8")입니다.
- 후위증가 연산이 우선적으로 실행되므로 ptr_a++ 을 통해, 시스템 내부적으로 기존 ptr_a 값이 사본으로 만들어지고 이를 리턴합니다. 그리고 나서 ptr_a 원본은 1 증가됩니다. * 연산자는 리턴된 이 ptr_a 증가 전 값의 "사본"을 전달 받습니다.
- 원본 ptr_a 는 1 증가되어 010FFDF"C" 이 되었고 (int 포인터이므로 주소값 자체는 4 만큼 증가한 셈입니다. 16진수로 8 + 4 = C) * 연산자는 ptr_a 의 기존값 사본인 010FFDF8 주소를 간접참조 하게 되어 최종적으로 a의 값인 2 를 리턴하게 됩니다.