inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

*count++ 에서 precedence 질문

349

notomo

작성한 질문수 1

3

후위증가연산자 ++가 우선순위가 더 높아서

*start++ 가 *(start++)와 동일하다는 것은 알겠습니다. 

하지만 이런식이라면 count라는 포인터변수에 ++ 라는 포인터 산술연산을 하고 

dereferencing을 한다는 말인데 

이것이 후위연산자라서 마치 dereferencing을 먼저하고 그 다음 더하는 것 같아서 헷갈립니다.

Operator precedence in C 를 보면 후위연산자가 제일 순위가 높던데 

후위연산자를 보면 우선순위에 맞게 괄호를 넣은 것처럼 보면서 계산하고 계산이 모두 끝난 뒤 후위연산자를 적용하는 방식으로 바라보아야 하나요? 

우선순위는 제일 높은데 정작 계산은 제일 나중에 되니 이해가 잘 안되네요.

c

답변 1

7

안소

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

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

51

3

main 함수에서 왜 int만 선언이 되는걸까요

1

54

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

54

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

48

1

프로토타입과 함수간의 인자 불일치

1

72

2

12.12 헤더 관련 질문

1

59

2

Visual Studio Community 2026 사용 문의

1

136

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

59

2

getchar(), putchar()

1

92

3

강의자리ㅛ

1

78

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

112

2

소스파일안에 여러 파일

1

75

2

F5와 F7의 차이

1

75

2

c = TWO * (a+b); 에서 a와 b는?

1

58

2

; 세미콜론을 붙이는 기준에 문의

1

68

1

Step over 기능 문의

1

53

2

2.6 강의 따옴표 출력 규칙 문의

1

74

2

int main 함수 관련 오류 문의

1

67

2

13.4 words[0]

0

60

2

11.7 함수를 구현해 봤습니다.

1

62

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

64

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

53

2

11.6 fit_str함수를 구현해 봤습니다.

1

53

2

11.5 코드 구현

1

67

2