求C语言大神给我讲解下下图中的c=(a-=a-5),(a=b,b+3); 的运算过程以及中间逗号的意思

下图是代码,求大神给我讲解一下这句话的运算过程 c=(a-=a-5),(a=b,b+3);以及中间逗号的意思

首先,请搞明白一种表达式叫逗号表达式,就是将一组语句连着写出来,中间用逗号分隔;表达式的取值是最后一个语句的取值。

c=(a-=a-5),(a=b,b+3); 这个语句是一个逗号表达式,前面的语句是c=(a-=a-5);后面的语句是(a=b,b+3);后面的语句也是个逗号表达式,整个表达式的值没有处理,所以不关心。

计算:

a-=a-5;即a-=-5;即a+=5;结果a=5

c=(a-=a-5)结果c=5,a=5

a=b结果a=0

b+3运算了等于3但没有保存结果,对a,b,c的值不产生影响

(a=b,b+3)的值是3,即b+3的结果,但这个结果也没有保存,对a,b,c的值不产生影响

最终:a=0,b=0,c=5

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-08-23
逗号运算符:

在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。

逗号运算:

在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。

例如:

int a1,a2,b=2,c=7,d=5;

a1=(++b,c--,d+3);

a2=++b,c--,d+3;

对于给a1赋值的代码,有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值,也就是(d+3)的值,为8,所以a1的值为8。

对于给a2赋值的代码,也是有三个表达式,这时的三个表达式为a2=++b、c--、d+3,(这是因为赋值运算符比逗号运算符优先级高)所以最终表达式的值虽然也为8,但a2=4(第2行代码运算完时,b=3,即第3行代码运行时,b的值为4)。

注意事项:

逗号运算的结合性是从左至右,完毕之后整个表达式的值是最后一个表达式的值。
例子:int a[2],x=2,y=5;

a[0]=(x+3,y++,x++);那么最终结果是:a[0]=2 x=3 y=6;

为何a[0]=2:因为(x++)是运算之后再自加

a[1]=(x++,x+3,x+7);那么最终结果是:a[1]=11 ,x=4

第一反应,我以为a[1]=10,就是3+7;其实是错的。

计算a[0]的时候,x++了一次,此时x=3;计算a[1]的时候,又x++一次,此时x=4,因此a[1]=4+7=11

不信你改成a[1]=(x++,x+7,x+3);调试一下,逗号表达试结果是7,就是4+3,说明经过一个逗号,x已经自加变成4了。[1]

再来一个关于结合性的例子:

int i=24;

i=(i++,i++,i++,i++);//i=27

因为逗号运算符的结合性是自左向右,所以四个i++会依次运行,但是最后一个i++在赋值之后才进行运算,所以最终返回27追问

如果按照你这么说C的值是逗号运算符里面的最后一个,那C的值应该是3才对,为什么编译出来的结果是C的值是5呢?
c=(a-=a-5),(a=b,b+3); (不是运算最后一个b+3 ?)

追答

你误解了,c的值是左面括号里运算结果的值,也就是说c等于5;
然后计算逗号右面括号,先计算a = b, 把b的值0赋与a,此时a等于0;再计算b+3,b就等于3,第二个括号里没有运算c的值,所以c并没有改变.

第2个回答  2016-08-23
中间的逗号起到分隔作用,逗号是一个双目运算符
(A,B)返回的是B的值,同时逗号是从左往右算,所以先算A
(a-=a-5)   中,先算a-5还是  -= ?要看运算符优先级,-比-=高,所以先算a-5 =-5
然后a-=-5,此时a仍未0,所以该表达式为5
第二个同理
(a=b,b+3)返回的是b+3

 值得一提的是,由于逗号比赋值优先级低,所以c=(A,B),(C,D)实际上是

c=(A,B),返回的是B

第3个回答  2016-08-23
这是逗号运算符  ,你可以百度一下 运算符的优先级  ,可以看到所有的运算符,然后看下逗号运算符的使用。
这有两个表达式 c=(a-=a-5) (a=b,b+3) 这个表达式里面又有2个表达式 
=优先级别会高于逗号,c=5, a=0 b=0 整个表达式的值会是3,
第4个回答  2016-08-23
a=0;b=0;c=5