参考 C 函数中的逗号分隔返回参数 [重复] ,
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
当编写return (x=x+2,x+1)
时,首先计算第一个表达式,以便计算x=x+2
表达式,导致x等于7作为副作用。然后计算并返回第二个表达式,因此该函数返回 x+1,因此返回 8。
如果你写了return (x+2,x+1);
,结果应该是 6,因为第一个表达式x+2
没有任何副作用。
分别计算return
中的两个部分,并返回最后一条指令的结果:
首先我们有:
x = x + 2 // 7
现在x
更新为第二次评估之前的7
,给出:
x + 1 // 7 + 1 = 8
最后返回8
.
为了更好地理解,请考虑中间变量的情况,如下所示:
return (y = x + 2, y + 1);
您方便地链接状态的 QA
逗号运算符计算一系列表达式。的值 逗号组是列表中最后一个元素的值。
所以价值
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("%dn", x);
return 0;
}
运行时会导致1
。
但是,当您这样做时
return (x=x+2, x+1)
你确实有一个副作用:x
首先递增 2,然后x
递增 1 并返回结果。
这是运算符优先级的问题。
x=x+2,x+1
被评估为(x=x+2), (x+1)
而不是x=(x+2,x+1)
正如其他用户所说,命令流从左到右,在return
的情况下,它将返回最右侧运算符中的值。在此运算符之前编写并用逗号分隔的内容与行编写表达式没有什么不同。例:
return (x = x + 2, x = x - 5, x + 1);
下面的代码产生相同的结果:
x = x + 2;
x = x - 5;
return x + 1;
对于x = 0
,这将返回-2
。请注意,对于这两个代码,如果我们x = x - 5
更改为x - 5
,即我们从x
中减去5
,但没有将其结果保存在任何地方,则x
的返回值将更改为3
,从而确认等价性。
逗号运算符在代码中引入序列点。语句按以下顺序计算:
-
x = x + 2
,此时fun
中的局部x
为 7。 -
x + 1
,计算结果为 8,然后返回。
为了澄清,下面是一个显示运算符优先级的括号版本:
return (x=x+2),x+1;
计算左侧表达式并将其值丢弃。右侧表达式的值是返回的内容。