通过引用调用与通过复制恢复调用

标签 c

我正在研究通过引用调用和通过复制/恢复调用。我有些困惑。假设我有一个 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/

相关文章:

c - 缓冲区溢出;避免溢出攻击

c - 避免杀戮导致的文件损坏问题

c - 使用 C libwebsockets 将音频流保存在文件中

c++ - 在不带/proc/self/exe的Linux上的C/C++中,运行时可执行文件的大小?

c - 如何在 C 中创建一个验证用户输入的函数?

了解 C 真的会损害您用高级语言编写的代码吗?

c - LinkedList在C中删除结束

c - ODE 求解器 C 程序系统的初始值问题

c - 实现一个可以有 parent / child 的结构

c - qsort() - 比较函数参数