本帖最后由 邵彩华 于 2013-4-28 21:42 编辑
我来解答下楼主的疑问:
一、首先要弄明白楼主真正的迷惑,才能让楼主弄清问题。至于单纯的a++和++a的运算顺序,不用解释楼主肯定是明白的;我想楼主的迷惑应该是:在如上面的混合运算中,多处出现++a,a或a++楼主就不知道该怎么用a 的值了,对吧^^
二、其实很简单,就先拿第一个表达式来说吧!int b = a + 3 * a++; 这其实是个运算优先级的问题,我们在赋值运算时,先计算=号右边的表达式的值,也就是a+3*a++;这里很多人都容易犯一个错误,就是先计算了+号右边的乘除,再计算相加运算的值,如上面二楼和五楼的分析就是不正确的。真正的顺序是这样的: 对于+运算,应该从左至右运算,先算左边表达式的值,再算右边表达式的值,然后相加。此题左边表达式a的值是2, 右边表达式3*a++中因为++在变量a后面,所以先让a值参与运算后a自增,3*2=6,a再自增变成3,于是,b=2+6,a=3。
第二个表达式int b = a++ + 3 * a;赋值符号右边的表达式a++ + 3 * a,根据加法的从左至右的运算顺序,先算a++,由于++在变量后面,故先把a值用于运算再自增1,+号左边表达式参与加法运算的值为2,a自增1后变为3,变化后的a值继续参与+号右边的表达式运算3*a=9,最后b=2+9, a=3;
第三个表达式就不用我再分析了吧,楼主自会分析。
总结:
A: 对于++a和a++,前者a先自增1再用a的值参与下一个运算,后者是先把a的值用于下一个运算再让a自增1,但不论哪一种情况,只要出了(++a)或(a++)这个表达式,再去使用a,那就是在使用a变化后的值。
B:对于分析运算顺序时,符号的优先级我就不用说了自己去查,除此要注意一点:我们应该先分析优先级最低的运算符的运算顺序,找到其先运算的表达式后,再依次类推。 不要见到*或/,就不管在什么位置先去运算,这是一个误区。比如||,对于表达式1+2<4||3*2>6,肯定不会先去计算右边的乘法运算,不然||就不叫短路或了。
C、对于++a+++b---c之类的表达式,从左至右分析时,如果++或--左边的变量没有自加自减运算,则++或—应该先考虑给前面的变量。所以此表达式运算顺序为(++a)+(++b)-(--c); 表达式a+++b---c等同于(a++)+(b--)-c;表达式 ++a++是不存在的。
|