为什么第二个输出6?

时间:2016-03-13 07:59:14

标签: c++ visual-studio-2015 pass-by-reference

void addOne(int &y)
{
    y = y + 1;
}

int main()
{
    int x = 5;
    std::cout << "x = " << x << '\n';
    addOne(x);
    std::cout << "x = " << x << '\n';
    return 0;
}

很抱歉,如果这是一个基本问题。但为什么y = y + 1是6?

2 个答案:

答案 0 :(得分:2)

最初可能有用的是将引用视为指针的语法糖。

请考虑以下事项:

int main() {
    int x = 5;
    int *px = &x;
    *px = 8;

    cout << x << endl;

    return 0;
}

这会打印出8,正如您所料。 (如果你没想到那么在处理引用之前可能值得阅读introduction to pointers。)

然后,引用变量可以被认为是指针变量,其语法是常规变量的语法。以下内容与前一个示例相同:

int main() {
    int x = 5;
    int &rx = x;
    rx = 8;

    cout << x << endl;

    return 0;
}

也就是说,rx成为对 x引用,因此每当您更改rx时,您也会更改x,因为这两个名称指的是同一个东西......换句话说,rx绑定到内存位置一个值,并设置{{1更改该内存位置的内容

从某种意义上说,rx有点不可见 - 它没有自己的存在,它只存在于rx的范围内(这就是为什么你必须初始化一个声明它时的引用,即你不能在一个函数中执行x并让它挂起来。

所以当你有:

int &rx;

这是一个函数,其参数是传递的内容的引用 ...因此,当参数引用发生更改时,引用所引用的引用也会发生变化。

所以当你这样称呼时:

void addOne(int &y)
{
    y = y + 1;
}

这会将int main() { int x = 5; std::cout << "x = " << x << '\n'; addOne(x); std::cout << "x = " << x << '\n'; return 0; } addOne联系起来,从而将x引用int &初始化为y,因此每当更改x时,{ {1}}已更改...因此yx更改为x,即5

您可以将其视为与以下内容等效:

5 + 1

要了解您使用引用与指针的原因,请参阅this question

答案 1 :(得分:1)

引用不是一个自变量,你应该认为字面上是另一个。因此,当您将x传递给函数addOne时,名为y的引用将逐字地变为x(这在屏幕后面如何工作现在不那么重要了)。

因此,当你将y增加1时,你真正在做的是增加x。在调用addOne之后,这就是为什么x是6的原因。