参加我的期末考试,并发现过去的考试问题:
考虑以下用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
答案 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。你必须以不同的方式阅读代码,假设不同的东西。