我正在通过引用查看呼叫并通过复制/恢复进行呼叫。我有些困惑。假设我有一个2参数函数,每个参数增加1。现在,如果我将这两个参数用作同一个变量,如incr(i, i)
,在通过引用调用和通过复制/恢复调用的情况下会发生什么?
答案 0 :(得分:4)
问题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个加1,将2加到第二),那么最终结果将取决于cr_0000
之前cr_0001
是否恢复,反之亦然。