想问一下给c=(a-=++a),(a+=b,b+=4)的运算过程

 

运算符的优先级多看看,以及运算符的结合方向

首先算第一个括号的,a -= ++a,也就是a = a - (++a),这里面首先算括号的++a,那么此时a=1了,是所有的a值都变成1了,

那么a = 1 - 1 = 0;第一个括号的值为0

然后算第二个括号的,其中,第二个括号里面先算a += b,即a = a + b,因为在第一个括号时算出a = 0,那么此时a = 0 + 0 = 0;

再算b += 4,即b = b+4,就是b = 0 + 4 = 4;逗号运算符中会将最后一个结果作为整个的值,即第二个括号的值为4

最后算c = 0,4;这里面涉及了等号运算符和逗号运算符,因为等号运算符优先级高,所以先算c = 0,最后这个语句相当于0,4。即4;

所以a = 0, b = 4 , c = 0 

程序的运行结果:0 4 0

解释:先看优先级:++ 大于 -=+== 大于 ,

           整个逗号表达式可看成c=(a-=++a)和(a+=b,b+=4)两部分

           对于前半部分,程序先算++a,再算a-=a,所以a=0,然后赋给c,前半部分就结束了

           对于后半部分,先算a+=b,由于此时b为0,所以a依旧为0,接着执行b+=4,所以b=4

误区:容易把c的值看成是(a+=b,b+=4)的结果,但由于 , 运算符优先级比 = 小,先执行的是 = 运算符

           如果想达到把(a+=b,b+=4)赋值给c的话,需在加一重括号,变为c=((a-=++a),(a+=b,b+=4))

你可以去试试printf("%d", (2,3,4));输出的值应该为4