[C++]Call-by-reference 질문입니다.
조회수 1301회
#include <iostream>
using namespace std;
void Plus(int * num)
{
++*num;
}
void reverse(int * num)
{
*num *= -1;
}
int main()
{
int num = 10;
int num1 = -9;
Plus(&num);
Plus(&num);
Plus(&num);
Plus(&num);
reverse(&num1);
cout << num << endl;
cout << num1 << endl;
return 0;
}
여기서 num값을 14로 출력되게 하는데 Plus 함수 내용을 *num++;로 하게되면 num의 값이 그대로 10이 출력되고 Plus함수를 참조자를 이용해서 void Plus(int &num) { num++; } 이렇게 하게되면 14가 됩니다. 참조자를 이용해서 num++ 하게되면 14가되고 포인터를 이용해서 *num++ 하게되면 10이 되는 이유가 궁금합니다.
1 답변
-
후위 ++
와*
의 우선순위를 비교해 볼 필요가 있습니다.http://en.cppreference.com/w/cpp/language/operator_precedence
이곳을 보시면
후위 ++
의 우선순위가 더 높은 것을 알 수 있습니다.void Plus(int* num) { *num++; }
좀더 이해하기 쉽게 위 함수를 풀어 쓰면 아래와 같은 함수가 됩니다.
void Plus(int* num) { int* temp = num; *temp num = num + 1; }
즉 입력 받은 주소의 정수에 그 어떤 증가연산도 적용되지 않습니다.
따라서
num
의 값이 수정되지 않습니다.void Plus(int& num) { num++; }
이 와 같은 경우 참조형이기 때문에 입력한 변수에 그대로 증가연산이 적용되어 14 가 됩니다.
댓글 입력