본문 바로가기
프로그래밍/C++

[정리] C++ 증감연산자와 포인터

by Nessie! 2022. 12. 1.
본 게시글은 C++ 기초 플러스 책을 읽고 제가 필요할때마다 직접 읽어보려고 매우 대충 정리한 글입니다. (진짜 개인공부용 글임) 따라서 다른 분들이 읽으려면 읽기 어려울 수 있음 주의 ㅎㅎ

증감 연산자!

int a = 0;

a++;

++a;

--a;

a--;

 

이런 식으로 사용할 수 있다.

 

이런 증감연산자는 접두어, 접미어 어떤 것으로 붙냐에 따라 연산이 실행되는 시점이 다른데 생각보다 간단하다.

뒤에 붙으면 뒤에 실행되는거고 앞에 붙으면 앞에 실행된다고 보면 된다. ㅋㅋ

 

무슨 말이냐 하면,

int main()
{
	int num = 0, val = 0;
    
    cout << num++ << endl;
    cout << ++val << endl;
}

이렇게 실행하면 둘 다 1이 출력이 된다.

근데 num은 num++ 이 부분이 실행이 되고 나서 증가되고, val은 ++val을 만나자마자 1이 증가된다고 보면 된다.

 

간단하게 말하자면 num++은 그 구문이 끝나고 값이 1이 더해지는거고, ++val은 일단 냅다 1을 더하고 실행된다고 생각하면 된다.

 

이 증감연산자는 당연하게도(?) 포인터에도 적용이 된다.

포인터에 사용하면 포인터가 지시하는 데이터형의 바이트 수만큼 그 값을 증감시킨다.

 

*연산자와 ++ 연산자를 쓰는 위치에와 우선순위에 따라 포인터를 증가하는 것인지, (다음주소로 넘어갈건지) 아님 그 주소의 값을 증가시킬건지가 정해진다.

 

*++p;

이렇게 쓰면 포인터가 증가된다.

이유는 참조 연산자(*)와 접두형 증감연산자는 우선순위가 같고, 오른쪽에서 왼쪽으로 결합한다.

즉, ++가 *의 오른쪽에 있기 때문에 ++가 먼저 p에 적용되고 나서, p의 새로운 값에 *가 적용된다.

그르니깐 ++p 하구 이 결과에 *가 붙으니, 다음 주소의 값을 가져온다고 보면 된다.

(배열이라 치면 2번째 원소를 가리키고 있게 되는거다)

 

++*p;

이렇게 쓰면 가리키는 값이 증가된다.

++가 *의 왼쪽에 있기 때문에 *가 먼저 적용되고 나서 그 값을 증가시킨다고 보면된다.

(가리키고 있던 2번째 원소의 값을 증가한다)

 

(*p)++;

이렇게 쓰면 괄호가 있기 때문에 *p를 먼저 구하고, 그 값에 ++하게된다.

(그럼 원래 가리키며 한번 증가시켰던 2번째 원소값을 한번 더 증가시킨다)

 

*p++;

이건 어떨까?

접미형 증감 연산자는 접두형보다 우선순위가 높다. 그럼 참조 연산자보다도 높을거고, 왼쪽에서 오른쪽으로 결합한다.

++연산자가 p에 적용되서 포인터가 증가된다. 

결과는 마찬가지로 p배열의 두번째 원소를 참조한다.

그리고 이 구문을 마치면 3번째 원소로 증가된다.

 

뭔말인가 했는데

++가 접미형으로 붙게되면, 그 구문을 마치면서 증가된다고 했었다.

그렇기 때문에 ++가 먼저 p에 적용되는건 맞으나, 그 구문이 끝나고나서 증가하는 상황이라고 이해하면 쉬울 것 같다.

즉, *p++; 를 출력하면 원래 가리키고 있던 2번째 원소의 값이 출력되는 건 맞는데, 이 구문이 끝나면 p는 3번째 원소를 가리키고 있을거라는 말이었다..!

 

책을 볼 수록 느끼지만 원래 아는 내용조차 헷갈리게 만드는 책인 것 같다 ㅎ;

'프로그래밍 > C++' 카테고리의 다른 글

[정리] C++ 함수와 배열  (0) 2022.12.02
[정리] C++ for문에서의 콤마 연산자  (0) 2022.12.01
[정리] C++ 복합 데이터형  (0) 2022.11.30
[정리] C++ 데이터 처리  (0) 2022.11.30
메모리 구조  (0) 2022.11.22

댓글