在了解编程中的副作用时,我遇到了这段代码:
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/