C语言问题 请大虾指教

来源:百度知道 编辑:UC知道 时间:2024/05/21 07:56:19
一道C题

main()
{
int c=5,a;
a=2+(c+=c++,c+8,++c);
printf("a=%d",a);
}

答案是14.
小弟看不懂a=2+(c+=c++,c+8,++c),括号里面的老是算不对.先算左面的c+=c++.还是右面的++c
请大虾把这3步(c+=c++,c+8,++c)的步骤和每步的运算结果告诉下.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
是不是C+8这段就没有意义了,
a=2+(c+=c++,c+8,++c)可以等价为a=2+(c+=++c)吗?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

谢谢大家的指教.
我觉得a=2+(c+=c++,c+8,++c)里,应该先算逗号表达式的表达式1,也就是c+=c++,由于c++是先调有c,再自加.所以c+=c++ 分解为 c+=5然后c++;此时c=11.
再算表达式2,c+8不会影响C值的变化,此处也就没什么意义.
然后再算表达式3,因为++c是先自加然后才调用C的值.最终逗号表达试的结果是12,C的值也是12.
如果将本例:a=2+(c+=c++,c+8,++c) 中第三个表达式++c该成c++的话,也就是a=2+(c+=c++,c+8,c++).
那么最终逗号表达式的值就不一样了.逗号表达试的结果将是11,而c还是等于12.
因为在算第3个表达式的++c时,是先调用C的值给逗号表达式,此时c为11,逗号表达式结束.然后C自加.c=12

括号里的运算
逗号运算
c++,C+8,++c
最后c=6
c+=....
c=12
a=2+(...)
a+14
逗号运算 表达式1,表达式2 其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值
计算逗号表达式
赋值
然后计算出结果

c+8不会改变变量的值,是没实际作用
a=2+(c+=c++,c+8,++c);
可以等价于
a=2+(c+=c++, ++c); 把c+8去掉
先算c+=c++,然而这句在C语言里是有二义性的,所以,此题与具体的编译器有关。

(c+=c++,c+8,++c) 中先算 c+=c++,

(c+=c++)
=(c=c+(c++)) //此时 c++中的 c取值5,随后c值变为6
=(c=6+5)
=11

(c+=c++,c+8,++c)该式为逗号表达式,运算顺序为从左到右,
其结果取逗号表达式的最后一个表达式的值,即 c++值。
所以:
a=2+(c+=c++,c+8,++c)
=2+(12,11+8,12)
=2+12
=14

怎么C就等于6了...感觉楼上还是没说清楚....

这个我已经说过了,,,呵呵.

C=12,具体的去查下书籍,逗号运算符