【问题标题】:What is the value of 'x' for each scenario?每个场景的“x”值是多少?
【发布时间】:2013-12-30 05:03:16
【问题描述】:

我有以下类似 C 的程序,我试图找出数组 x 的最终值:

  • 参数 x 按值传递。
  • 参数 x 通过引用传递。
  • 参数 x 通过 value-result 传递。

代码:

void swap(int[] list, int i, int j)
{
    int temp = list[i];
    list[i] = list[j];
    list[j] = temp;
}

void main() 
{
    int x[3] = {5, 2, 4};
    swap(x, 1, 2);
}

如果我的操作正确,对于按值传递,在调用中我们有...

swap(x, 1, 2)
{
    temp = x[1] // temp now equals 2
    x[1] = x[2] // x[1] now equals 4
    x[2] = temp // x[2] now equals 2
}

...那么我们有以下内容,对吗?

x[3] == {5, 4, 2}

编辑:

我尝试在 ideone.com 上编译并收到:

prog.c:1:17: error: expected ‘;’, ‘,’ or ‘)’ before ‘list’
 void swap(int[] list, int i, int j)
                 ^
prog.c:8:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
 void main() 
      ^
prog.c: In function ‘main’:
prog.c:11:5: warning: implicit declaration of function ‘swap’ [-Wimplicit-function-declaration]
     swap(x, 1, 2);
     ^

【问题讨论】:

  • 编程语言只按值传递值
  • int[] list 等于 int* list 所以你总是将指向数组第一个元素的指针传递给这个函数(不是值,不是引用,而是指针或指针的值,如果你喜欢)跨度>
  • 如果你通过值传递xswap 不会改变main 中的x,所以它不会从 main 的 POV 做任何事情。 (我假设一些“类似 C”的语言实际上可以按值传递数组)
  • 你所说的“C-like”是什么意思?在实际的 C 中,数组将在此处通过引用有效地传递,而不是通过值传递。当你传递像这样的数组时,C 实际上传递了一个指向数组第一个成员的指针,而不是数组本身。
  • 找出答案的最简单方法是运行代码。

标签: c arrays pass-by-reference pass-by-value


【解决方案1】:

其实,当你打电话时

swap(x, 1, 2);

您正在使用 call-by reference,因为您正在传递参数 x,它是一个 指针 到数组 x 的第一个元素。所以这种交换技术会起作用,你会得到你所期望的,元素现在的顺序是 {5,4,2}

【讨论】:

  • 我明白了。那么经过VALUEVALUE-RESULT 呢?对这些有什么想法吗?
  • 我认为按值传递在您的方案中没有用处,因为它仅适用于变量的副本,而不适用于变量本身。无论如何,这里有一个链接,您可以自己决定:courses.cs.washington.edu/courses/cse505/99au/imperative/…
猜你喜欢
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 2018-03-10
  • 1970-01-01
  • 2012-08-02
  • 2019-01-01
相关资源
最近更新 更多