c - 输出如何取决于这段代码中参数的评估顺序?

标签 c side-effects

在了解编程中的副作用时,我遇到了这段代码:

    int add(int x, int y)
    {
        return x + y;
    }

    int main()
    {
        int x = 5;
        int value = add(x, ++x); // is this 5 + 6, or 6 + 6?  It depends on what order your compiler evaluates the function arguments in



       printf("%d",value); 
    return 0;
}

我不明白为什么这里的输出是顺序相关的。我的意思是,如果首先评估第一个参数,则 x 为 5。然后评估++x,将 x 更改为 6。我怀疑 x 已更改为 6,这意味着第一个参数中的 x 也应该变为 6。因此,有效的函数调用应该是 add(6,6);,如果第二个参数首先被评估,这也是相同的。那为什么作者说结果取决于操作数的求值顺序呢?请解释。在了解副作用时,我真的很困惑。

最佳答案

由于函数按值接收参数,因此使用表达式调用函数等同于将这些表达式分配给临时变量,然后使用这些变量调用函数。所以

add(x, ++x);

如果参数是从左到右计算的,它等同于:

temp1 = x; // temp1 = 5, x = 5
temp2 = ++x; // temp2 = 6, x = 6
add(temp1, temp2); // add(5, 6)

如果它们是从右到左计算的,则相当于:

temp2 = ++x; // temp2 = 6, x = 6
temp1 = x; // temp1 = 6, x = 6
add(temp1, temp2); // add(6, 6)

C 没有指定参数的求值顺序,而是明确指出像这样的代码会因此产生未定义的行为。

关于c - 输出如何取决于这段代码中参数的评估顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44140769/

相关文章:

programming-languages - 我应该如何管理新语言设计中的副作用?

haskell - 对调用者来说看起来很纯粹但内部使用突变的函数

java - 模拟模拟方法的副作用

c - ARM vector 表

java - 标准流和操作系统

c++ - 副作用不起作用

c - 迷你 shell 项目中的信号处理程序

c++ - float 乘以零是否保证产生零?

c - 在 gdb 中出现 seg 错误(调试)