为什么第二个输出是 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 ℞
并让它挂起)。
因此,当您有:
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;
}
若要了解为什么使用引用与指针,请参阅此问题。
引用不是一个自变量,你应该认为它是另一个。因此,当您将 x 传递给函数 addOne 时,名为 y 的引用实际上变成了 x(现在屏幕后面的工作方式不太重要)。
所以当你把y增加1时,你真正在做的是增加x。这就是为什么 x 是 6,在调用 addOne 之后。
相关文章:
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- 等待整个 omp 块完成,然后再调用第二个函数
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 将第二个 GATT 服务添加到 Movesense 容器
- 如何在 c++ 中根据第二个元素按降序对列表进行排序
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 比较 2 个向量并从第二个向量中删除在第一个 - c++ 中找不到的元素
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 如何输出字符串第二个单词的第一个字母?
- 该程序无法显示第二个迭代的输出
- 程序运行,但程序中的第二个功能不打印?输出中没有错误
- 为什么第二个程序的输出和第一个程序不同
- 为什么第二个输出是 6.
- 为什么第一个程序不起作用,而第二个程序有效?其次,为什么输出是它给出的
- 用c++调用的第二个构造函数(错误的输出)
- 我的 for 循环第一次正确输入,但第二次不正确,并显示第二个输入的输出。我不明白为什么会这样。
- 如何组合两个查询并使用第一个查询的结果作为第二个查询的输出
- 什么可能导致第一个代码片段的输出不同于第二个和第三个