为什么第二个输出是 6.

Why is the second output 6?

本文关键字:输出 第二个 为什么      更新时间:2023-10-16
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?

最初,可能会有所帮助的是将引用视为指针的语法糖。

请考虑以下事项:

int main() {
    int x = 5;
    int *px = &x;
    *px = 8;
    cout << x << endl;
    return 0;
}

这将打印出8,如您所料。(如果你没想到,那么在处理参考文献之前,可能值得阅读指针的介绍。

因此,可以将引用变量视为指针变量,其语法是常规变量的语法。以下内容等效于上一个示例:

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;
}

这调用了带有xaddOne,从而初始化int &引用y x,因此每当y被更改时,x都会被更改......因此x55 + 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;
}

若要了解为什么使用引用与指针,请参阅此问题。

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

所以当你把y增加1时,你真正在做的是增加x。这就是为什么 x 是 6,在调用 addOne 之后。

相关文章: