이 글에서는 C와 C++에서 전위(prefix) 증감 연산자와 후위(postfix) 증감 연산자의 우선순위를 살펴봅니다.
연산자 우선순위의 기본 규칙
C/C++에서 증감 연산자와 역참조 연산자의 우선순위는 다음과 같습니다.
- 전위 연산자(
++,--)는 역참조 연산자(*)보다 높은 우선순위를 가집니다. - 후위 연산자(
++,--)는 전위 연산자와 역참조 연산자 모두보다 더 높은 우선순위를 가집니다.
따라서 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을 실행하면 포인터가 아닌 포인터가 가리키는 값(H)이 1 증가하므로, 결과적으로 '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++은 후위 연산자의 우선순위가 더 높기 때문에 포인터 자체가 증가하여 다음 메모리 위치를 가리키게 됩니다. 따라서 두 번째 문자인 'e'가 출력됩니다.
정리
| 표현식 | 해석 | 동작 |
|---|---|---|
++*ptr | ++(*ptr) | 포인터가 가리키는 값이 증가 |
*ptr++ | *(ptr++) | 포인터 주소가 증가한 후 역참조 |
두 표현식은 비슷해 보이지만 연산 대상이 완전히 다르므로, 포인터와 증감 연산자를 함께 사용할 때는 괄호를 명시적으로 사용하는 것이 코드의 가독성과 안정성 측면에서 권장됩니다.