提问人:Sophia 提问时间:10/21/2021 最后编辑:Vlad from MoscowSophia 更新时间:10/21/2021 访问量:124
我不理解C++代码的一部分,有人可以解释一下吗?
I don't understand a part of the C++ code, can someone explain it?
问:
我想知道是否有人可以解释为什么 f2(a,a);是 13 13 而不是 12 12?
这是否与&符号有关,如果是这样,这意味着什么?
提前致谢!
#include <iostream>
using namespace std;
void f1 (int a, int b){
a = 12; b = 13;
}
void f2 (int& a, int& b){
a = 12; b = 13;
}
int main()
{
int a = 10; int b = 11;
f1(a,b);
cout << a << ' ' << b << ' ';
f2(a,b);
cout << a << ' ' << b << ' ';
f2(a,a);
cout << a << ' ' << b;
}
答:
1赞
Jesper Juhl
10/21/2021
#1
在您的调用中,两个参数都引用相同的变量 ()(与号表示“引用”),因此这就是您要更改的全部内容。函数首先为它赋值 12,然后你为它赋值 13 - 这就是最终值。该函数调用不会更改函数中的变量,并保留其值 (13),因此当您随后打印 和 in 时,您将得到 13 和 13。f2(a, a)
a
b
main
a
b
main
评论
0赞
Eljay
10/21/2021
如果两个参数引用都引用同一个调用方的参数,是否具有未定义行为的可能性?如果是这样,在什么情况下(这是其中一种情况)?
0赞
Jesper Juhl
10/21/2021
@Eljay我认为只有当这两个参数具有不同的类型时,您才能进入 UB 土地。但我不是 100% 确定。
0赞
AmaanZA
10/21/2021
#2
通过将这两个参数赋值为 as,您将作为引用参数执行此操作,并且您的代码将按顺序执行。因此,首先给定值 12(分配给函数中形式参数的值),然后为同一变量赋予值 13(分配给函数中形式参数的值)。程序部分中的变量在函数调用后是 13 。a
f2(a,a);
a
a
b
b
main
f2(a,b);
1赞
Vlad from Moscow
10/21/2021
#3
此功能
void f2 (int& a, int& b){
a = 12; b = 13;
}
通过引用接受其参数。所以这样称呼它
f2(a,a);
这两个参数都是对同一对象的引用。a
起初,为这个对象分配了值12
a = 12;
然后使用值重新分配13
b = 13;
因此,引用对象的结果值为 。a
13
为了更清楚起见,您可以按以下方式想象函数调用及其定义(我将参数重命名为 a1 和 b1 以避免名称冲突)
f2(a,a);
// ...
void f2 ( /* int& a1, int& b1 */ ){
int &a1 = a;
a1 = 12;
int &b1 = a;
b1 = 13;
}
因此,通过对对象的引用和 来更改对象。a
a1
b1
也就是说,您可以声明对同一对象的多个引用,并按任意顺序使用引用来更改引用的对象。该对象将包含通过其中一个引用分配给它的最后一个值。
在此电话会议之前请注意这一点
f2(a,a);
有以下电话
f2(a,b);
将变量的值设置为 。b
13
所以这句话经过以上两个调用
cout << a << ' ' << b;
输出
13 13
评论
12 12
a
a
b
f2
a = 12
f2
a
main
12
b=13
b
a
a
b
main
a
b
f2