繁体   English   中英

为什么第二个输出为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?

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

考虑以下:

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

addOnex调用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;
}

要了解为什么要使用引用还是使用指针,请参阅此问题

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

因此,当您将y增加1时,您实际上所做的就是增加x。 这就是为什么在调用addOne之后x为6的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM