为什么第二个输出是6?

Why is the second output 6?

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呢?

引用不是自变量,你应该按字面意思考虑它是另一个。因此,当您将 x 传递给函数 addOne 时,称为 y 的引用字面意思变成了 x(现在它在屏幕后面的工作方式不太重要)。

所以当你将 y 增加 1 时,你真正做的是增加 x。这就是调用 addOne 后 x 为 6 的原因。

最初可能会有帮助的是将 references 视为 pointers.

的语法糖

考虑以下几点:

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 绑定到 内存位置 不是 一个值,设置 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;
}

这会用 x 调用 addOne,从而将 int & 引用 y 初始化为 x,因此每当 y 发生变化时, x 被改变...所以 x5 变成 5 + 1, 即 6.

你可以认为它等同于以下内容:

void addOne(int *py)
{
    *py = *py + 1;
}

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

要了解为什么要使用引用而不是指针,请参阅 this question