C语言逗号表达式的问题 x=6,y=7,z=8 r=func((x--,y--,x+y),z--)

C语言逗号表达式的问题
x=6,y=7,z=8
r=func((x--,y--,x+y),z--)

这里x+y为11,z为8是为什么?

首先说明原理: 

1)逗号运算符也称顺序求值运算符,即从左至右顺序执行,最后一个值会覆盖前面的值,所以使用逗号将几个表达式连接起来的带括号的表达式,最终整个逗号表达式的值为最后一个表达式的值。

2)自增和自减运算符有前置和后置之分,在混合运算中,前置是先自增或者自减,再进行取值;而后置恰好相反,即先取值进行运算,然后再自增或者自减。

在r=func((x--,y--,x+y),z--)这个函数调用中,第一个参数使用了原理1)和2),第二个参数使用了原理2)。

       首先对于第一个参数(x--,y--,x+y),这是一个逗号运算符,从左至右运算:x--(先取x的值,然后x自减,其值变为x=5),同理(先取y的值,然后y自减,其值变为y=6),但由于这是一个逗号运算符,因此x+y的值为x+y=5+6=11,最终r=func((x--,y--,x+y),z--)=func(11,z--);

       其次,z--同理,先取值z=8进行传参数,进行函数调用r=func((x--,y--,x+y),z--),然后z才执行自减(从而z=7)

       补充:如果x--,y--换成r=func((--x,--y,x+y),z--)结果也是一样的,这是因为逗号运算符是从左至右进行运算的,先算完第一个逗号之前的表达式,在计算第二个逗号之前的表达式,依此类推,故,无论是前置还是后置,x的值都是在计算第二个逗号之前已经改变;但是逗号运算符中最后一个逗号除外(前置才起作用,后置对逗号表达式的结果没影响。。。

       书写不易,人艰不拆,不喜勿喷,谢谢点赞!!!

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-03-14
逗号表达式使用逗号连接起来的几个式子。。从左往右执行,最后整个逗号表达式的值为最后一个表达式的值。

所以先执行x-- y-- 然后执行x+y 最后整个逗号表达式的值为x+y的值。即11

z--表示在这个语句中先使用z。。语句之后在--。 即执行完r=()之后 z的值为7,但在当前z使用值为8追问

x与y为什么不像z一样后减,得x+y为13?

追答

因为x--也是一个表达式,在x--中使用的是6. 表达式过后就是5。同理y

逗号表达式是顺序 执行 。也就是说算是一条语句·~

本回答被提问者和网友采纳
第2个回答  2015-01-15
x--, 是表达式评估之后才递减,评估完括号里第一个参数x--后,x变成5
同理,评估完括号里第二个参数y--, y变成6
等到评估x+y时,5+6,自然就是11啦。
z--,评估之后才递减,所以传给func的值还是8。追问

评估是什么意思?

追答

英语里叫 evaluate, 就是计算表达式的值。
当c语言里遇见序列点就会评估序列点之前表达式的值。逗号就是序列点之一。

第3个回答  2015-01-15
因为x和y自减了以后作为第三个参数
而z--表达式的值为z自减之前的值,为8
表达式运行结束了以后,z为7
第4个回答  2018-07-10
逗号表达式使用逗号连接起来的几个式子。。从左往右执行,最后整个逗号表达式的值为最后一个表达式的值。
所以先执行x-- y-- 然后执行x+y 最后整个逗号表达式的值为x+y的值。即11
z--表示在这个语句中先使用z。。语句之后在--。 即执行完r=()之后 z的值为7,但在当前z使用值为8
相似回答