有人可以解释一下通过此代码的值/引用传递的过程
Can someone explain the process of passing by value/reference of this code?
void Twist(int a, int& b)
{
int c;
c = a+2;
a = a*3;
b = c+a;
}
以下涉及 Twist(所有变量类型 int)的代码片段的输出是什么?
r = 1;
s = 2;
t = 3;
Twist(t,s);
cout << r<< ''<< s<< ''<< t<< endl;
我知道这显示 1、14、3,但为什么?
这很简单。
当你按值传递某些东西时(当你在函数中传递第一个变量时),该变量的副本就会诞生!
另一方面,当您通过引用传递某些内容时,实际变量会进入函数。
在您的示例中,您传递了 a 的副本,但实际的 b。因此,当您退出函数时,t
没有改变,而通过引用传递s
则发生了变化。
void Twist(int a, int& b)
{
// a is 3 and b is 2
int c;
c = a+2; // c = 3 + 2 = 5
// CAREFUL: This is not the actual t you passed. It is a copy.
a = a*3 // a = 3 * 3 = 9.
// THIS IS the actual s you passed. NOT a copy.
b = c+a; // b = 9 + 5 = 14
// Now when you get out the value of s is updated to 14
}
twist(t,s)
之后
r
之所以1
,是因为它永远不会改变。
t
是3
,因为它是通过值传递到Twist
的,所以它永远不会改变。
s
之所以14
,是因为它是通过引用传递到Twist
的,所以Twist
中s
发生的任何更改都会改变Twist
之外的s
值。
按值传递会创建一个内容相同的新变量,就像在新变量a
中复制 t
值的情况一样。
通过引用传递,就像在变量s
的情况下一样,通过引用传递给b
,这个b
不是一个新变量,而只是变量s
的另一个名称。
您对b
执行的任何操作都将反映在s
上。
因此,当您修改函数中的变量b
Twist
时,s
变量的值也会被修改。
相关文章:
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- Xcode 语义问题引用或以前定义的代码
- 如何编译使用循环引用的代码?
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 如何在 c# 代码中通过引用调用时从 c++ dll 更新数组值?
- 为什么我的C++代码无法编译,出现未定义的引用错误
- 我的代码中C++未定义的引用错误?
- 为什么从 constexpr 引用生成的程序集代码与从 constexpr 指针生成的程序集代码不同?
- 为什么此代码片段有效?如何取消引用空点?
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 在没有引用传递资源的情况下,如何在java中简化这些代码
- 使用 Android NDK 使用 clang++ 编译C++代码时对"_Unwind_Resume"的未定义引用
- LLvm Jit:如何从抖动代码中取消引用运行时指针?
- 当我使用按引用返回时,我不知道这些代码之间的区别
- 寻找有关为什么此C++代码在没有引用的情况下不起作用的解释
- 此代码中的右值引用在哪里?
- 我可以在将项目编译为静态库(未定义的引用)时在代码中使用 QImage 吗?
- 此代码如何使用整数为您提供引用?
- 相互引用的代码设计的类
- 代码::具有 SFML 2,4 的块中未定义的引用