为什么 fun 函数的 return 值是 8 而不是 7?

Why is the return value of the fun function 8 instead of 7?

参考 C 函数中 逗号分隔的 return 参数 [重复] ,

x=x+2,x+1;

将被评估为

x=x+2; 

但是,如果是下面的代码

#include<stdlib.h>
#include<stdio.h>

int fun(int x)
{
    return (x=x+2,x+1); //[A]
}

int main()
{
   int x=5;
   x=fun(x);
   printf("%d",x); // Output is 8
}

不应该行[A],被评估为

x=x+2;

给予x = 7

语句return (x = x + 2, x + 1);等同于:

x = x + 2; // x == 7
return x + 1; // returns 8

您方便链接的 QA 状态

The comma operator evaluates a series of expressions. The value of the comma group is the value of the last element in the list.

所以价值

x+2,x+1;

x+1并且没有副作用。


示例代码:

#include<stdio.h>
int main(int argc, char * argv){
    int x;
    x = 0;
    x = (x+2, x+1);
    printf("%d\n", x);
    return 0;
}
当 运行.

结果为 1


然而,当你这样做时

return (x=x+2, x+1)

确实有副作用x先加2,然后x加1,返回结果。

当写 return (x=x+2,x+1) 时,第一个表达式首先被求值,所以 x=x+2 被求值,导致 x 等于 7 作为副作用。然后计算并返回第二个表达式,因此函数 returns x+1 因此 returns 8.

如果你写 return (x+2,x+1);,结果会是 6,因为第一个表达式 x+2 没有任何副作用。

return中的两部分分别求值,最后一条指令的结果是returned:

首先我们有:

x = x + 2 // 7

现在 x 在第二次评估之前更新为 7 给出:

x + 1 // 7 + 1 = 8

最后 return 8.

为了更好地理解中间变量的情况如下:

return (y = x + 2, y + 1);

正如其他用户所说,命令流从左到右,在 return 的情况下,它将返回最右边运算符中的值。在这个运算符之前写的,用逗号分隔的,和行写的表达式没什么区别。示例:

return (x = x + 2, x = x - 5, x + 1);

下面的代码产生相同的结果:

x = x + 2;  
x = x - 5;
return x + 1;

对于 x = 0,这将 return -2。请注意,对于这两个代码,如果我们将 x = x - 5 更改为 x - 5,即我们从 x 中减去 5 但不在任何地方保存其结果,return x 的值将更改为 3,因此确认等效性。

这是运算符优先级的问题。

x=x+2,x+1 被评估为 (x=x+2), (x+1) 而不是 x=(x+2,x+1)

逗号运算符在您的代码中引入了一个序列点。这些语句按以下顺序计算:

  1. x = x + 2,此时fun中的局部x为7.

  2. x + 1,计算结果为 8,并返回。

为了澄清,这是一个显示运算符优先级的带括号的版本:

return (x=x+2),x+1;

计算左边的表达式并丢弃它的值。右侧表达式的值是返回值。