Sure, here is the updated table with a column for original content in either Chinese or English:
| Operator | Description | Original Content |
|---|---|---|
| + | Addition or String concatenation | Java 的 + 既是加法运算符,也是字符串连接的运算符 |
| - | Subtraction or Negation | 减号 - 还可以做求负的符号 |
| % | Modulo | 进行求余运算 % 的两个数不必都是整数,如果为浮点数 float or double, 除剩下的即为余数,如果除数为0,则余数为 NaN |
| ++ | Increment | ++可以用于整数或浮点数 |
| = | Assignment | 赋值运算符。a = 3; 是一个赋值表达式,这个赋值表达式本身也是有值的,它的值就是右边被赋的值,即3. 因为这个特性,可以一次为多个变量赋值,如:int a, b, c;a = b = c = 3; //不推荐这么写 |
| & | Bitwise AND, Conditional AND | 位运算符 与, 不短路与 |
| | | Bitwise OR, Conditional OR | 位运算符 或, 不短路或 |
| ~ | Bitwise NOT | 位运算符 否 |
| ^ | Bitwise XOR | 位运算符 异或 |
| « | Left shift | 位运算符 « move to left |
| » | Arithmetic right shift | 位运算符 » move to right 右移後,高位用符号位填充 |
| »> | Logical right shift | 位运算符 »> move to right without signal 右移後,高位总是用0填充 |
| == | Equality | 如果两个操作符都是数值类型,即使它们的值不相同,但只要值相等,就返回 true如 97 == ‘a’ 返回 true如果两个操作数是引用类型,则只有父子关系才能比较。 |
| && | AND | 与 |
| || | OR | 或 |
| ! | Logical NOT | ! |
| ^ | Logical XOR | ^ |
1 + 2 + "hello" -> 3hello
"hello" + 1 + 2 -> hello12
问题
a = a + b;
a += b;
上面两个式子的底层实现方式有什么区别?
位运算时,低于 int 的类型(byte, short, char)的操作数总是先自动转成int後再移位。
对于 int 类型的整数位移 a >> b, 如果 b >32,系统会先对 b 求余,再位移,如:
a >> 33 相当于 a > 1
类似,对于 long 类型的整数位移 a >> b, 如果 b > 64,系统会先对 b 求余,再位移,如:
a >> 65 相当于 a > 1
如果两个操作符都是数值类型,即使它们的值不相同,但只要值相等,就返回 true
如 97 == 'a' 返回 true
如果两个操作数是引用类型,则只有父子关系才能比较。