【问题标题】:Can someone explain the process of passing by value/reference of this code?有人可以解释通过此代码的值/引用传递的过程吗?
【发布时间】:2023-03-03 00:02:01
【问题描述】:
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,但为什么呢?

【问题讨论】:

  • 请自己算算(不要投反对票)
  • 真的给1,14,13吗??
  • 为什么人们不运行代码并单步调试调试器看看发生了什么?这是一项非常有用的技能,他们应该在写代码之前教它。
  • 请显示实际输出。 cout 语句中没有逗号,因此它不能是“1、14、13”。我怀疑的是13。它应该有输出“1 14 3”。
  • 对不起。这是一个错字。

标签: c++


【解决方案1】:

很简单。

当您通过值传递某些东西(当您传递函数中的第一个变量时)时,该变量的副本就诞生了!

另一方面,当你通过引用传递一些东西时,actual 变量会进入函数。

在您的示例中,您传递了 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
}

【讨论】:

    【解决方案2】:

    twist(t,s)之后:

    r1,因为它永远不会改变。

    t3,因为它是通过 传递到Twist,所以它永远不会改变。

    s14,因为它是通过reference 传递到Twist,所以Twists 发生的任何更改都会改变s 外部的值Twist.

    【讨论】:

      【解决方案3】:

      按值传递会创建一个内容相同的新变量,就像将t 的值复制到新变量a 中的情况一样。

      通过引用传递就像你在变量s通过引用传递给b时所做的那样,这个b不是一个新变量,它只是你的变量s的另一个名称。

      您在b 上执行的任何操作都将反映在s 上。

      因此,当您在 Twist 函数中修改变量 b 时,s 变量的值也会被修改。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多