【问题标题】:Passing by reference and assigning into a variable [closed]通过引用传递并分配给变量[关闭]
【发布时间】:2019-02-26 22:27:53
【问题描述】:

我正在研究通过引用传递。这让我想知道在以下示例中会发生什么(用支持“通过引用”的伪 C 编写):

int foo(int a) {
    a = 5;
    return a * 2;
}

int main() {
    int a = 1;
    a = foo(a);
    printf("%d",a);
    return 0;
}

应该打印什么?如果我们只做foo(a); 而不分配到a 那么我们将得到5。但是分配时会打印什么?应该是5 还是10

【问题讨论】:

  • 你运行它时发生了什么?
  • 由于您正在想象一个具有按引用传递的伪 C,您必须自己决定与参数传递相关的语义是什么。我不明白你怎么能指望 us 回答这个问题,至少不适合 SO。
  • 在您为pasudo-C 语言提供“通过引用”变量传递的语义之前,没有人可以回答这个问题。
  • 你为什么要假设一个伪 C?为什么不问a = foo(&a);int foo(int* a) { *a = 5; return *a * 2; }?或者问一下 C++ 在哪里可以找到int foo(int& a)
  • 删除了C 标签。我认为只有一种方法可能,如果不是,那么查看对差异、好处以及使用它的真正 PL 的解释会更有帮助。我不认为这是一个“基于意见”的问题,但如果是的话,我很抱歉。

标签: pass-by-reference


【解决方案1】:

由于您的main() 函数中有a = foo(a);,因此a 将包含foo(a) 返回的结果。无论a 是什么,foo(a) 总是返回 10。

C 不支持按引用传递。将a = foo(a); 更改为仅foo(a); 将意味着a 将保留它在传递给foo() 之前的值,因此它将是1。

支持按引用传递的 C 的一种变体是 C++。在 C++ 中,您可以将 foo() 写为:

int foo(int &a) {
    a = 5;
    return a * 2;
}

int &a 语法用于表示参数将通过引用传递。现在,foo 会将 5 分配给引用的变量,但仍然总是返回 10。

在这种情况下,a = foo(a); 将导致 a 的值为 10,而单独的 foo(a); 将导致 a 的值为 5。

【讨论】:

  • 他说的是类 C 形式的“伪代码”,而不是 C。但是伪代码完全是主观的。我标记了他的问题是基于意见的。
  • @DustinNieffenegger:我同意对伪代码的精确解释可能是主观的。但是,它是指定算法的通用语言,因此应该可以对其进行推理而不被认为是基于意见的。
猜你喜欢
  • 2012-10-15
  • 2018-06-09
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
相关资源
最近更新 更多