본 게시글은 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 |
댓글