为什么第二个输出是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 ℞
并让它挂起)。
所以当你有:
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
被改变...所以 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;
}
要了解为什么要使用引用而不是指针,请参阅 this question。
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 ℞
并让它挂起)。
所以当你有:
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
被改变...所以 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;
}
要了解为什么要使用引用而不是指针,请参阅 this question。