特定的参数传递样式:按值调用、按名称调用等

Posted

技术标签:

【中文标题】特定的参数传递样式:按值调用、按名称调用等【英文标题】:Specific Parameter-Passing Styles: Call-By-Value, Call-By-Name, etc 【发布时间】:2011-05-21 22:39:20 【问题描述】:

为我的期末考试而学习,并遇到了这个过去的考试问题:

考虑以下用类 C 表示法编写的程序:

int i = 1;
A[] = 4, 0, 1, 2;

void mystery05(int from, int to)

    int temp;
    temp = A[from];
    A[from] = A[to];
    A[to] = temp;
    i = i + 2;
    to = -1;


int main(void)

    mystery05(A[i+2], A[i]);

在下表中,在 main.js 中调用神秘05 后,用适当的变量值填写方框。每行对应一个特定的参数传递样式(即使用列出的样式而不是默认的 C 语言语义)。假设数组从 0 开始索引。

style               |___i___|__A[0]__|__A[1]__|__A[2]__|__A[3]__| 
call-by-value       |_______|________|________|________|________|
call-by-name        |_______|________|________|________|________|
call-by-reference   |_______|________|________|________|________|
call-by-value-result|_______|________|________|________|________|

我不知道该怎么做,但如果它是常规的 C 语义,我想答案应该是

i = 3; A[0] = 4; A[1] = 2; A[2] = 1; A[3] = 0

【问题讨论】:

你的问题到底是什么? 我希望能够学习如何使用不同的参数传递样式正确填写表格。它们为什么以及如何不同。 @Bobby S:我们不会为你写出完整的答案。但请接受提示。它不是“常规的 C 语义”。每一行都是不同的语义,而不是“常规 C”。 @S.Lott:我很清楚这些行中的每一行都不是常规的 c 语义,这就是问题的重点。每一行都是不同的参数传递语义。 @Bobby S.“每一行都与参数传递语义不同”准确地说。那你的问题是什么? 【参考方案1】:

@S.Lott: 我认为指向字符串和数组的指针是通过引用调用的。我错了吗?

我同意:不想做所有的问题。如果他有考试,他应该得到更多的线索。 我想回答第一行,但只是为了看看我是否理解正确。 所以我可能是错的!

按值调用:除非变量是全局变量,否则不会更改值 在这种情况下,它们必须是; proc如何使用i。

i 和 A 数组都是全局的。

proc 中发生的事情会改变值。

i 从值 1 开始,因此 A[3] 和 A[1] 的值交换了。

A[3] 现在是 0 , A[1] 现在是 2 。 A[0] 和 A[2] 不变。

最后 i 值改为 3

我认为考试 q 在 proc 调用后没有询问 'to' 的值,因此错过了一个技巧。

【讨论】:

指向字符串的指针在类型声明中包含一个“*”,因此在函数调用中包含一个隐含的“&”。 @Bobby S 哇!谢谢。非常慷慨。让我的老师徽章回答一个我仍然不能 100% 确定的问题!祝你考试好运。 :)【参考方案2】:

按值调用是——我认为——你所说的“常规 C 语义”是什么意思

按名称调用是 C 所没有的。查一下。这不是“常规 C 语义”

引用调用假定所有参数都有“&”,参数有“*”。这不是“常规 C 语义”,而是一种不同的语义,但很容易用 C 语言构建。

call-by-value-result 是 C 所没有的。查一下。

每个都是不同的。不要假设 C。不要像 C 一样阅读代码。你必须假设不同的事物以不同的方式阅读代码。

【讨论】:

... 那么,为什么 OP 需要查找这些东西呢?他不应该已经有笔记了吗?我的意思是,考试通常是为了测试课堂上教授的概念......

以上是关于特定的参数传递样式:按值调用、按名称调用等的主要内容,如果未能解决你的问题,请参考以下文章

java的传参究竟是按值传递的还是按引用传递的

java学习笔记:java的方法参数传递

Java按值调用和按引用调用的区别

java中的参数传递是按引用传递还是按值传递

我应该在哪里更喜欢按引用传递或按值传递?

VB 参数传递:按值传递和按地址传递