2

次の C ライクなプログラムの結果はどうなるでしょうか? Ada の in out のように、パラメーター受け渡しメカニズムが copy-in-copy-out の場合はどうなりますか? の実行中、swap(v, list[v])v3 に更新され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 ではメカニズムが明示的であり、コンパイラーはたとえそれがばかげているとしてもそれに従います。

言語が参照渡しを指定する特定の状況がいくつかあります。それ以外の場合、実際にはコンパイラ次第であり、別のメカニズムではなく、使用されているメカニズムに依存することはできません。実際には、コンパイラは賢明なことを行います。これは通常、オブジェクトがマシンレジスタに収まる場合はコピーし、そうでない場合は参照します。

リストしたCコードのAdaバージョンで何が起こるかは、それをAdaにどのように変換するかによって異なります。そうするときに、C で驚くべき動作を引き起こす可能性のあることがわかると思います.Ada コンパイラは、それを許可しないか、見た目が失われるような方法で文書化することを強制します.奇妙な。

于 2012-04-24T13:01:37.697 に答える
0

パラメータは呼び出しが実行される前にバインドされるため、x は v にバインドされ、y は list[1] にバインドされます。

于 2012-04-24T13:38:17.253 に答える