![](/img/trans.png)
[英]Why the first programme does not work but second works ? and in second why the output is as it gives?
[英]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 ℞
在一个函数中,并将其挂起)。
所以当你有:
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
调用addOne
,从而将int &
引用y
初始化为x
,因此每当y
更改时, x
被更改...因此x
从5
变为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.