인프런 커뮤니티 질문&답변

notomo님의 프로필 이미지
notomo

작성한 질문수

홍정모의 따라하며 배우는 C언어

10.8 두 개의 포인터로 배열을 함수에게 전달해주는 방법

*count++ 에서 precedence 질문

작성

·

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-decrementpre-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 를 리턴하게 됩니다.

notomo님의 프로필 이미지
notomo

작성한 질문수

질문하기