我在为期末考试做准备,偶然发现了这道考题:
考虑用类似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中的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= 4;A1 = 2;A2 = 1;A3 =0
发布于 2010-12-08 11:30:23
@S.Lott :我以为‘指向字符串和数组的指针是通过引用调用的。我说错了吗?
我同意:我不想做所有的问题。如果他有考试,他应该更有头绪。不过,我想回答第一行,看看我是否理解正确。所以我可能是错的!
按值调用:除非变量是全局的,否则不更改值;否则进程如何使用i。
I数组和A数组都是全局的。
proc中发生的事情改变了这些值。
我从值1开始,所以A3和A1的值互换了。
A3现在是0,A1现在是2。A和A2保持不变。
最后,我的值更改为3
我认为考试Q错过了一个技巧,因为在proc调用之后没有询问'to‘的值。
发布于 2010-12-08 08:09:17
按值调用--我想--您所说的“常规C语义”是什么意思?
call-by-name是C所没有的。查一查。这不是“常规的C语义”
按引用调用假定所有参数都有"&“,参数有"*”。这不是“常规的C语义”,它是一种不同的语义,但很容易用C构建。
按值调用的结果是C语言所没有的。查一查。
每一个都是不同的。不要假设C。不要把代码当成C。你必须以不同的方式阅读代码,假设不同的东西。
https://stackoverflow.com/questions/4382971
复制相似问题