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

时间:2010-12-08 00:03:16

标签: c parameters reference semantics

参加我的期末考试,并发现过去的考试问题:

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

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中调用mystery05后,用适当的变量值填入框。每行对应一个特定的参数传递样式(即使用列出的样式而不是默认的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

2 个答案:

答案 0 :(得分:1)

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

我同意:不想做所有的问题。如果他参加考试,他应该更加努力。 我想回答第一行,只是为了看看我是否理解正确。 所以我错了!

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

i和A数组都是全局的。

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

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

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

最后我将值改为3

我认为考试q错过了一个技巧,因为他没有询问过程调用后'到'的价值。

答案 1 :(得分:0)

按值调用是 - 我认为 - 你的意思是“常规C语义”

按名称呼叫是C没有的东西。仔细看看。这不是“常规C语义”

call-by-reference假设所有参数都有“&”参数有“*”。这不是“常规C语义”,它是一种不同的语义,但很容易用C语言构建。

按值调用结果是C没有的东西。仔细看看。

每个都不同。不要假设C.不要将代码看作是C。你必须以不同的方式阅读代码,假设不同的东西。