最近在研究表达式求值,看了下论坛推荐的JSEL和Aviator,感觉都挺不错, 我只要能做算术的基本运算以及一些比较、逻辑运算就好了, 它俩都已经能满足我对表达式求值的要求了。
运算符优先级刚好复习一下, 有些确实是记不得了。
优先级 运算符 结合性
1 () [] . 从左到右
2 ! +(正) -(负) ~ ++ -- 从右向左
3 * / % 从左向右
4 +(加) -(减) 从左向右
5 << >> >>> 从左向右
6 < <= > >= instanceof 从左向右
7 == != 从左向右
8 &(按位与) 从左向右
9 ^ 从左向右
10 | 从左向右
11 && 从左向右
12 || 从左向右
13 ?: 从右向左
14 = += -= *= /= %= &= |= ^= ~= <<= >>= >>>= 从右向左
说明:
移位运算符
“>>”右移;“<<”左移;“>>>”无符号右移
位逻辑运算符
“&”与;“|”或;“~”非;“^”异或
“&”与;“|”或;“~”非是基本逻辑运算,由此可以演变出“与非”、“或非”、“与或非”符合逻辑运算、“^”异或是一种特殊的逻辑运算,对它求反可以得到“同或”,所以“同或”逻辑也要“异或非”逻辑。
“&”两个运算数都为1时,结果为1,其余结果为0
“ | ”两个运算数都为0时,结果为0,其余结果为1
“ ^ “两个运算数相同时,结果为0,不同时结果为1
” ~ “0变成1,1变成0
布尔运算符:
&&:对运算数进行与运算,当所有的运算数都为true时,结果为true,否则为false;&&是短路与,意思是:当对运算数的表达式进行从左到右运算时,若遇到右运算数的值为false,则结束运算,将结果置为false
||:对运算数进行运算,当所有运算数都为false时,结果为false,否则结果为true;||是短路或,意思是:当对运算数的表达式进行从左到右的运算时,若遇到有运算数的值为ture,就结束运算,将结果置为true
!:对运算数的值进行取反运算,运算数为true,取反为false;
&:&运算符和&&一样,对运算数做与操作,不同的是它不是短路的,它会运算完所有的运算数表达式
|:|运算符和||一样,对运算数进行或操作,但它不是短路的
赋值运算符:=;+=;-=;*=;/=;&=;|=;^=;
i+=j ------ i=i+j
i-=j ------ i=i-j
i*=j ------ i=i*j
i/=j ------ i=i/j
i&=j ------ i=i&j
i|=j ------ i=i|j
i^=j ------ i=i^j