我正在研究通过引用调用和通过复制/恢复调用。我有些困惑。假设我有一个 2 参数函数,每个参数递增 1。现在,如果我将这两个参数用作同一个变量(例如 incr(i, i)
),在通过引用调用和通过复制/恢复调用的情况下会发生什么?
最佳答案
问题What's the difference between call by reference and copy/restore部分涵盖了这一点,但还不够完整。维基百科文章 Evaluation Strategy很有帮助。
以下是函数 incr()
的两个实现和调用,该函数采用两个参数并递增每个参数。
通过引用调用
#include <stdio.h>
void incr(int *pi1, int *pi2)
{
(*pi1)++;
(*pi2)++;
}
int main(void)
{
int i = 57;
printf("%d\n", i);
incr(&i, &i);
printf("%d\n", i);
return 0;
}
输出:
57
59
通过复制/恢复调用
incr
函数实际上与引用调用版本相比没有变化。
#include <stdio.h>
void incr(int *pi1, int *pi2)
{
(*pi1)++;
(*pi2)++;
}
int main(void)
{
int i = 57;
printf("%d\n", i);
{
int cr_0000 = i; // Copy for first argument
int cr_0001 = i; // Copy for second argument
incr(&cr_0000, &cr_0001);
i = cr_0001; // Restore for second argument
i = cr_0000; // Restore for first argument
}
printf("%d\n", i);
return 0;
}
输出:
57
58
请注意,使用此 incr()
函数,恢复值的顺序并不重要,但如果 incr()
函数不对称地处理其参数(例如,第一个加 1,第二个加 2),那么最终结果将取决于 cr_0000
是否在 cr_0001
之前恢复,反之亦然。
关于通过引用调用与通过复制恢复调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28379077/