如果参数传递机制是copy-in-copy-out(就像Ada中的in out),下面的类C程序会得到什么结果?
swap(v, list[v])
执行过程中,v
会更新为3。复制出来时,是否会将第二个参数的结果复制到列表[3]
,或列表[1]
?
swap(int x, int y){
int t = x;
x = y;
y = t;
}
main(){
v = 1;
int list[5] = {1,3,5,7,9};
swap(v, list[v]);
print v, list[0...4];
}
最佳答案
Ada 的参数传递机制不是复制输入复制输出。 Ada 与 C 不同,C 的机制是明确的,编译器会遵循它,即使这样做是愚蠢的。
在某些特定情况下,语言指定事物通过引用传递。否则,这实际上取决于编译器,并且不允许您依赖于正在使用的一种机制而不是另一种机制。在实践中,编译器会做明智的事情,通常归结为如果对象适合机器寄存器则进行复制,否则进行引用。
您列出的 C 代码的 Ada 版本中会发生什么具体取决于您如何将其转换为 Ada。我怀疑当你这样做时你会发现,在 C 中可能会导致潜在的令人惊讶的行为,Ada 编译器要么不允许你这样做,要么会强制你以不再看起来像的方式来记录奇怪。
关于parameter-passing - 拷入拷出参数(值-结果参数传递),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10290654/