特定的参数传递样式:按值调用、按名称调用等
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 需要查找这些东西呢?他不应该已经有笔记了吗?我的意思是,考试通常是为了测试课堂上教授的概念......以上是关于特定的参数传递样式:按值调用、按名称调用等的主要内容,如果未能解决你的问题,请参考以下文章