【问题标题】:I don't understand a part of the C++ code, can someone explain it?我不明白 C++ 代码的一部分,有人可以解释一下吗?
【发布时间】:2021-12-07 14:05:31
【问题描述】:

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

}

【问题讨论】:

  • 你能解释一下为什么你期望它是12 12吗?
  • 因为在 void f2 a 是 12,这就是为什么我期望它是 12
  • 您将a 传递给f2ab 变量。这些是通过引用传递的。当它在f2 函数中执行a = 12 时,您确实也将a 的值从main 更改为12;但是,紧接着,它会执行b=13,其中b 仍然是与a 相同的变量。请注意,main 内的变量 abf2 内的 ab 不同。

标签: c++ c++11 pass-by-reference


【解决方案1】:

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

【讨论】:

  • 是否有两个参数引用都引用同一个调用者的参数有未定义行为的可能性?如果是这样,在什么情况下(这是其中一种情况)?
  • @Eljay 我认为只有当这两个参数具有不同类型时,您才能进入 UB 领域。但我不是 100% 确定。
【解决方案2】:

这个函数

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 正在通过对它的引用a1b1 进行更改。

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

在通话之前注意这一点

f2(a,a);

有以下调用

f2(a,b);

将变量b的值设置为13

所以上面两个调用之后的这个语句

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

输出

13 13

【讨论】:

    【解决方案3】:

    通过将a 分配给f2(a,a); 作为两个参数,您将这样做作为参考参数,并且您的代码将按顺序执行。所以a首先被赋予值12(分配给函数中形参a的值),然后同一个变量被赋予值13(赋予函数中形参b的值)。程序的main 部分中的变量b 在函数调用f2(a,b); 之后是13。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      • 2021-08-18
      • 2016-11-21
      • 1970-01-01
      • 2016-09-28
      • 2019-02-01
      • 1970-01-01
      相关资源
      最近更新 更多