parameter-passing - 拷入拷出参数(值-结果参数传递)

标签 parameter-passing ada

如果参数传递机制是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/

相关文章:

ada - -gnatyo 实际上执行什么样式检查?

javascript - 将 javascript 参数从对象构造函数传递到对象的方法?

javascript - 是否可以在函数内部传递变量作为 javascript 中的参数?

c - 为什么我们在传递二维数组作为参数时需要指定列大小?

c - 将 c short 分配给 Ada short_integer

c++ - Ada 到 C++ : Pass an unsigned 64-bit value

ada - 将映射传递给通用过程

string - 调用 C# 代码时,PowerShell $null 不再为 null

c++ - 在 C++ 中,传递给函数的指针的更改是否反射(reflect)在调用函数中?

ada - 是否可以声明 Range 类型的变量或常量?