2

如果参数传递机制是copy-in-copy-out,如Ada中的in out,那么下面的类C程序会产生什么结果?执行过程中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];
}
4

2 回答 2

4

Ada 的参数传递机制不是copy-in-copy out。Ada 不像 C,其机制是明确的,编译器会遵循它,即使这样做很愚蠢。

在某些特定情况下,语言指定事物是通过引用传递的。否则,这实际上取决于编译器,并且不允许您依赖正在使用的一种机制而不是另一种机制。在实践中,编译器会做一些明智的事情,如果对象适合机器寄存器,通常归结为复制,否则引用。

您列出的 C 代码的 Ada 版本中发生的情况取决于您将其转换为 Ada 的方式。我怀疑当你这样做时你会发现在 C 中可能会导致令人惊讶的行为的事情,Ada 编译器要么不会让你这样做,要么它会迫使你以不再看起来的方式记录奇怪。

于 2012-04-24T13:01:37.697 回答
0

参数是在调用执行之前绑定的,所以 x 绑定到 v,y 绑定到 list[1]。

于 2012-04-24T13:38:17.253 回答