如果参数传递机制是copy-in-copy-out,那么下面的C-like程序的结果是什么,就像在Ada中一样?
在执行swap(v, list[v])
期间,v
将更新为3.复制时,第二个参数的结果是否会复制到list[3]
或list[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];
}
答案 0 :(得分:3)
Ada的参数传递机制是不 copy-in-copy out 。 Ada不像C,其中mechanisim是显式的,编译器将遵循它,即使它是愚蠢的。
在某些特定情况下,语言指定通过引用传递内容。否则,它实际上取决于编译器,并且不允许您依赖于使用的一种机制而不是另一种机制。在实践中,编译器将执行合理的事情,如果对象适合机器寄存器,通常可以归结为复制,否则引用。
您列出的C代码的Ada版本中发生的情况取决于您将其转换为Ada的确切方式。我怀疑你会发现当你这样做会导致在C中引起潜在惊人行为的事情,Ada编译器或者不会让你这么做,或者它会迫使你以不再看起来的方式记录奇怪的。
答案 1 :(得分:0)
参数在执行调用之前被绑定,因此x绑定到v,y绑定到list [1]。