本帖最后由 司懿卓 于 2012-11-11 17:31 编辑
public class TheGameTest
{
public static void main(String[] args)
{
int a = 5; int b = 4;
int c = a++ - --b * ++a / b-- >>2 % a--;
System.out.println(c);
}
}
上面是代码部分. 运算符优先级(上面所包含的):
第一个: ++ -- (自加,自减)
第二个: * / % ( 乘,除和求余)
第三个: + - (加,减)
第四个: >> (右位移)
这是四个运算符的等级,单目最前,位移最后.. 可是,我手动的结果是 int c = 0 ;
但是,用编译器运行的结果是int c = -1 ;
其中,有个想法是自加或自减 ++a ;a++ ;的运算符为最优先,所以先自身运算(再放入表达式内).
我知道这个想法是错误的,但结果依旧是0.
这个是分解动作:
//因为 a++(a--) 在其表达式内是先加入运算在进行赋值,就是说表达式内a++ =5,其值不变
int c = a++ - --b * ++a / b-- >>2 % a--;
c = 5++ - --4 * ++5/4-- >> 2 % 5--
c = 5 - 3* 6/4 >> 2%5 //单目运算符优先级最高
c = 5 - 4 >> 2 // 3*6/4 是int 类型 结果取整 为4 , 2%5=2
c = 1 >> 2 // 减法优先于 位移运算符
c = 0 // 1 右位移2次 结果为0
(表达式最好不要这样写,真的很头晕...)
哪位朋友能帮忙解惑?? 或者指出我计算时的错误..
=================== 下面是问题解决 ============================
表达式 int c = a++ - --b * ++a / b-- >>2 % a--;
a 在表达式内 先a++, 再++a ,然后a-- .
其实,a的值有变3次,
第一个a++,没有为表达式提供改变 ,但是,为后面的++a赋了一次值.
第二个++a,开始自加然后(因为前面的a++的赋值) ++a=7,后面a--的值因为前面有变动所以a--的值为7,
但是因为要参与2%a--的运算,所以无意义,2%7的值 为 2..
b在表达式内出现了2次,它的值也变动了
--b 先自减然后赋给自身 --b=3 ,然后是b--,因为前面已经赋给自身,所以b--也继承了前面的值 现在 b--=3
因为,b--是先运算后自减,所以b--的值 依旧是3 不变!
因此上面的式子应该这样运算:
int a = 5; int b = 4
int c = a++ - --b * ++a / b-- >>2 % a--;
c = 5 - 3*7/3 >>2 % 6
c = 5 - 7 >> 2
c = -2 >> 2
c = -1 //-2右移两次结果是 -1 ..
================== 问题的根源所在 ====================
因为 ++a 和 a++ 是两种自加方法,有所不同..
++a 是先自加再参与运算 ;
a++ 是先参与运算在自加;
下面来解析下不同:
(1) int a = 0 ; | (2) int c = 0;
int b = ++a + ++a ; | int d = c++ + ++c ;
int b = (0+1) + (1+1) ; | int d = (0) + (1+1);
int b = 3 ; | int d = 2;
第一个a++ 先自加 值为:1 第二个 a自加之前值已经为1 , 再自加为2 | 第一个c++是先运算再自加,值为0. 第二个++c
因为之前的c++,所以运算后赋值自身,所以++c值为2;
上面的两个表达式也算是找出了最上面问题的所在了...
希望斑竹给个分分吧... |