Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 ++*ptr, *ptr++, *++ptr의 차이점 — 연산자 우선순위 완벽 이해하기

포인터와 증가 연산자의 조합

C++에서 *ptr++, *++ptr, ++*ptr은 언뜻 비슷해 보이지만, 각각 완전히 다른 의미와 결과를 가집니다. 이 차이를 제대로 이해하려면 후위 증가 연산자(postfix ++)와 전위 증가 연산자(prefix ++)의 우선순위를 먼저 알아야 합니다.

연산자 우선순위를 정리하면 다음과 같습니다.

  • 후위 ++ 또는 --: 가장 높은 우선순위를 가지며, 전위 ++와 역참조 연산자(*)보다 우선 적용됩니다.
  • 전위 ++ 또는 --: 역참조 연산자(*)보다 높은 우선순위를 가집니다.
  • 역참조 연산자 *: 위 두 연산자보다 낮은 우선순위를 가집니다.

따라서 ptr이 포인터일 때, *ptr++*(ptr++)로 해석되고, ++*ptr++(*ptr)로 해석됩니다.

예제 1: ++*ptr — 포인터가 가리키는 값 증가

#include<iostream>
using namespace std;
int main() {
   char arr[] = "Hello World";
   char *ptr = arr;
   ++*ptr;
   cout << *ptr;
   return 0;
}

출력 결과

I

처음에 ptr은 문자열의 첫 번째 문자 'H'를 가리킵니다. ++*ptr++(*ptr)과 같으므로, 포인터가 가리키는 값 자체를 1 증가시킵니다. 그 결과 'H'가 'I'로 바뀌어 화면에 출력됩니다.

예제 2: *ptr++ — 현재 값을 참조한 후 포인터 이동

#include<iostream>
using namespace std;
int main() {
    char arr[] = "Hello World";
    char *ptr = arr;
    *ptr++;
    cout << *ptr;
    return 0;
}

출력 결과

e

처음에 ptr은 'H'를 가리킵니다. *ptr++*(ptr++)으로 해석되며, 후위 증가 연산자가 먼저 적용되어 포인터 자체가 다음 요소로 이동합니다. 문장이 실행된 후 ptr은 두 번째 문자 'e'를 가리키게 되고, 이후 출력문에서 역참조된 값 'e'가 화면에 나타납니다.

예제 3: *++ptr — 먼저 이동한 후 값 참조

#include<iostream>
using namespace std;
int main() {
    char arr[] = "Hello World";
    char *ptr = arr;
    *++ptr;
    cout << *ptr;
    return 0;
}

출력 결과

e

이 예제에서도 포인터를 증가시킵니다. 전위 증가 연산자(++)의 우선순위가 더 높기 때문에 포인터가 먼저 다음 요소로 이동하고, 그다음 역참조 연산자(*)로 값을 가져옵니다. 따라서 'e'가 출력됩니다.

세 표현식 한눈에 정리

표현식컴파일러 해석동작
++*ptr++(*ptr)포인터가 가리키는 이 1 증가
*ptr++*(ptr++)현재 값을 참조한 후 포인터가 다음 요소로 이동
*++ptr*(++ptr)포인터가 먼저 이동한 후 해당 위치의 값 참조

핵심은 ++가 포인터 자체에 적용되는지, 아니면 포인터가 가리키는 값에 적용되는지를 구분하는 것입니다. 괄호를 명시적으로 사용하면 코드의 의도를 훨씬 명확하게 전달할 수 있으므로, 실무에서는 (*ptr)++ 또는 *(ptr + 1)처럼 가독성 좋은 형태로 작성하는 것이 좋습니다.