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

C语言逗号表达式的问题 x=6,y=7,z=8 r=func((x--,y--,x+y),z--)
其次,z--同理,先取值z=8进行传参数,进行函数调用r=func((x--,y--,x+y),z--),然后z才执行自减(从而z=7)补充:如果x--,y--换成r=func((--x,--y,x+y),z--)结果也是一样的,这是因为逗号运算符是从左至右进行运算的,先算完第一个逗号之前的表达式,在计算第二个逗号之前...

c语言逗号表达式的问题
先算x=a+b得x=6,然后把x的值赋给了y,得y=6,接着运算b+c 如果把y=(x=a+b),(b+c);改成y=((x=a+b),(b+c));那么x=6,y=10.明白了吧?呵呵,我查过书的哦!!C语言提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来。如:3+5,6+8 称为逗号表达式,又称为“...

C语言两道小题
func((x--,y++,x+y),z--)语句里(x--,y++,x+y)是个逗号表达示,每一条都会运算,但结果只取最后一条:X先-1得5,Y再+1得8,最后 x+y=((x-1)+(y-1))=((6-1)+(7+1))=13 所以括号内的最终值是13,就有func(13,8)给传递过去得结果 13+8=21(被输出)第二题就是个纯粹...

关于C语言求值的问题
(x--,y++,x+y)是逗号运算结果是x+y!则r=func(x+y,z--);

C语言逗号表达式
c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14;a=(a=3*5,...

c语言逗号表达式
如y=(x=a+b),(b+c)中的逗号表达式(x=a+b),(b+c)有2个元子,分别为1:(x=a+b)和2:(b+c)。先计算1得到(x=6),元子1的值为6,此时X值为6;再计算2得到10,元子2的值为10;将元子2的值传给y,传到y=10.y=(x=a+b),(b+c);改为y=((x=a+b),(b+c)); 两种表述...

C语言中逗号表达式的问题有哪些?
逗号表达式的运算级最低,比赋值运算符级别还低。所以 y=(x=a+b),(b+c);先算x=a+b=6,再y=x=6;而后面的b+c不影响x和y的值。所以最终x,y的值都是6.只不过 y=(x=a+b),(b+c);这整个式子的值是b+c=10而已。如果是y=((x=a+b),(b+c)); 那么才结果是x=6,y=b+c=10...

这道C语言的题怎么解?
其实只要记住逗号表达式中最后一个表达式的值,才是逗号表达式的最终结果。所以,循环条件中只有y<10,才是判断循环是否进行的条件。所以循环体每次结束后,x和y的值如下:15 2 7 4 3 6 1 8 0 10 0 12 退出循环结后的输出果就是图中红色显示的内容 ...

c语言题目:int x=6,y=3,z; print(%d\\n,z=(x\/y,x%y));结果是多少? 顺便...
x\/y=2;x%y=0;z=(2,0);z=0;不懂看下面逗号表达式问题。逗号表达式 逗号表达式的一般形式是:表达式1,表达式2,表达式3……表达式n 逗号表达式的求解过程是:先计算表达式1的值,再计算表达式2的值,……一直计算到表达式n的值。最后整个逗号表达式的值是表达式n的值。看下面几个例子:x=8*2,x...

c语言逗号的使用:为什么最后运算结果是y=6,x=6
y=(x=a+b),故x=a+b=6,y=x=6 后面的表达式b+c没有实际作用。

相似回答