通过引用调用vs通过复制还原调用

时间:2015-02-07 05:49:54

标签: c

我正在通过引用查看呼叫并通过复制/恢复进行呼叫。我有些困惑。假设我有一个2参数函数,每个参数增加1。现在,如果我将这两个参数用作同一个变量,如incr(i, i),在通过引用调用和通过复制/恢复调用的情况下会发生什么?

1 个答案:

答案 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是否恢复,反之亦然。