J2SE_运算符_表达式

来源:互联网 发布:单片机 pc 编辑:程序博客网 时间:2024/06/04 00:46

1. i++,++i

2.& && | ||

&& || 会短路(即前一个为false或true,后面就不运行)

3.顺序

++--

*/

+-

>><<

><

=!=

&

|

&&
||

 

 

 

 

 

 

 

 

 

 

 

 

 

 

得到的结论: 自增自减运算符, 如果是符号在值之后, 会首先记录一下需要自增一次. 这个自增发生的时机:
1. 运算式结束.
2. 对同一个值需要进行下一次自增或自减运算.
就总结得到这么一点, 如果有不合适或不完整的地方, 期待楼下高手指点...

Java code
/** * @param args */ public static void main(String[] args) { int a = 2;// int y = a ++ + ++ a * --a; //结果是14, 首先做*, 然后做+, /** * 两个栈, 一个数值栈, 一个符号栈.(下面对自增自减运算符没有对优先级判断, * 因为我知道的自增自减的运算符优先级好像算是最高了吧....不对的话请见谅) * 1. 读入a++, a++的值返回为2, 记录a一次自增.a++的返回值入栈 * 2. +号入栈, 此时值栈[2], 符号栈[+] * 3. 读入++a, ++a返回多少呢? 这里是先自增后运算的++a, * 然而, 前面还记录了一次a的自增, 所以, ++a返回4 * 返回的4也入栈. * 4. 此时值栈[2, 4], 符号栈[+] * 5. 符号栈有元素, 读取*后比较*和+的优先级, * 如果栈内的符号优先级大于等于新读取的符号, 值栈的栈顶出栈两个元素, 符号栈元素出栈, 进行运算. * 计算结果重新入栈到值栈. * 如果栈内的符号优先级小于新读取的符号, 新读取的符号继续入栈. * 在这里, 由于栈顶符号+优先级小于新读取符号*, 所以, *继续入栈, 进入符号栈. * 6. 所以, *号入栈后值栈[2, 4], 符号栈[+, *] * 7. 然后读取--a, 上面做完++a之后, a值是4, 并且是没有记录自增或自减的. 因此, --a返回3, 而a值也成为3. * 8. 根据7, 也就是说将--a的返回值3入栈到值栈中. 此时值栈[2, 4, 3], 符号栈[+, *] * 9. 运算时读取完毕. * * 下面是出栈进行运算. * 1. 值栈出栈3. * 2. 符号栈出栈* * 3. 值栈出栈4 * 4. 运算3*4 = 12; * 5. 符号栈出栈+ * 6. 值栈出栈2 * 7. 运算12 + 2 = 14; * */// int z = a ++ - ++ a; //结果-2, 如果把-号变成+号, 结果就是6, 所以, 在做减法运算的时候, a++部分值为2, ++a部分为4 int x = a ++ - a ++; //结果是-1, 如果把-号变成+号, 结果就是5, 所以, 在做减法运算的时候, -号左边值是2, 右边值是3; System.err.println(x); }
原创粉丝点击