[C++]Call-by-reference 질문입니다.

#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 가 됩니다.

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.