我不理解C++代码的一部分,有人可以解释一下吗?

I don't understand a part of the C++ code, can someone explain it?

提问人:Sophia 提问时间:10/21/2021 最后编辑:Vlad from MoscowSophia 更新时间:10/21/2021 访问量:124

问:

我想知道是否有人可以解释为什么 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;

}
C++ C++11 按引用传递

评论

5赞 Joseph Sible-Reinstate Monica 10/21/2021
你能解释一下你为什么期望它吗?12 12
0赞 Sophia 10/21/2021
因为在虚空 f2 a 是 12,这就是为什么我把它排除为 12
3赞 ChrisMM 10/21/2021
您将同时传递到 的 和 变量。这些是通过引用传递的。当它在函数中执行时,您确实也在更改 from to 的值;但是,紧接着,它确实如此,其中仍然是与 相同的变量。请注意,变量和 inside 不相同,并且 inside .aabf2a = 12f2amain12b=13baabmainabf2
1赞 Fred Larson 10/21/2021
尝试阅读如何在 C++ 中使用引用参数?

答:

1赞 Jesper Juhl 10/21/2021 #1

在您的调用中,两个参数都引用相同的变量 ()(与号表示“引用”),因此这就是您要更改的全部内容。函数首先为它赋值 12,然后你为它赋值 13 - 这就是最终值。该函数调用不会更改函数中的变量,并保留其值 (13),因此当您随后打印 和 in 时,您将得到 13 和 13。f2(a, a)abmainabmain

评论

0赞 Eljay 10/21/2021
如果两个参数引用都引用同一个调用方的参数,是否具有未定义行为的可能性?如果是这样,在什么情况下(这是其中一种情况)?
0赞 Jesper Juhl 10/21/2021
@Eljay我认为只有当这两个参数具有不同的类型时,您才能进入 UB 土地。但我不是 100% 确定。
0赞 AmaanZA 10/21/2021 #2

通过将这两个参数赋值为 as,您将作为引用参数执行此操作,并且您的代码将按顺序执行。因此,首先给定值 12(分配给函数中形式参数的值),然后为同一变量赋予值 13(分配给函数中形式参数的值)。程序部分中的变量在函数调用后是 13 。af2(a,a);aabbmainf2(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;

因此,引用对象的结果值为 。a13

为了更清楚起见,您可以按以下方式想象函数调用及其定义(我将参数重命名为 a1 和 b1 以避免名称冲突)

f2(a,a);

// ...

void f2 ( /* int& a1, int& b1 */ ){
    int &a1 = a;
    a1 = 12; 
    
    int &b1 = a;  
    b1 = 13;
}

因此,通过对对象的引用和 来更改对象。aa1b1

也就是说,您可以声明对同一对象的多个引用,并按任意顺序使用引用来更改引用的对象。该对象将包含通过其中一个引用分配给它的最后一个值。

在此电话会议之前请注意这一点

f2(a,a);

有以下电话

f2(a,b);

将变量的值设置为 。b13

所以这句话经过以上两个调用

cout << a << ' ' << b;

输出

13 13