[toc]
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op1.html
# Operators
## Assignment Operator(賦值運算子)
最常見的運算子
把右邊的值assign到左邊的變數。
```java
int i = 1;
i = i + 1;
```
並且整個expression值是右邊的值。
```java
System.out.println(i = 2); // 2
int j = i = 3;
System.out.println(i); // 3
System.out.println(j); // 3
```
對於類別來說, 會讓左邊的變數參考右邊的物件。
```java
Object o = new Object();
```
## Arithmetic Operators(算術運算子)
```
+ 加法 (也可用於字串相加)
- 減法
* 乘法
/ 除法
% 取餘數 (remainder)
```
## Unary Operators(一元運算子)
```
+ 表示正值 (不寫也是正值)
- 把一個expression"負", (我不知道怎麼解釋, 大概就是 * -1)
++ 數值+1
-- 數值-1
! 反轉boolean
```
Example:
```java
int i = +1;
int j = 1;
int k = -2;
k = -k;
i++;
--j;
boolean b = true;
boolean c = !b;
```
---
**i++ 等同於 i+=1 , return the original value(回傳原始值)**
**++i 等同於 i+=1 , return the updated value(回傳原始值+1)**
```java
int i = 10, j=10;
System.out.println(i++); // 10
System.out.println(++j); // 11
System.out.println(i); // 11
System.out.println(j); // 11
```
## Equality and Relational Operators(等於/比較運算子)
```
== (如果是比對物件 會比較是否為同一個instance)
!=
>
<
>=
<=
```
## Conditional Operators (條件運算子)
```
&& AND
|| OR
```
```java
boolean t = true;
boolean f = false;
boolean b1 = t && f; // false
boolean b2 = t || f; // true
```
在多個OR中, 如果其中一個成立, 後面的邏輯皆不會判斷
```java=
public class Main {
public static void main(String[] args) {
if(a() || b())
System.out.println("hello, world");
}
public static boolean a() {
System.out.println("a");
return true;
}
public static boolean b() {
System.out.println("b"); // 不會執行
return true;
}
}
```
## Bitwise and Bit Shift Operators(位元運算子)
```
& Bitwise AND
| Bitwise OR
^ Bitwise XOR (exclusive OR)
~ Bitwise NOT
<< Bitwise Left Shift
>> Bitwise Right Shift (會考慮正負號的bit)
>>> Bitwise Right Shift
```
## 優先級
如果同級, 會由左至右
可以用`(...)`強制順序。
因此, 不要太依賴優先級, 使用括號明顯的寫出先後順序是個good practice.
```java
x + y / 100 // 不建議
x + (y / 100) // 建議
```
### 優先級列表
- Unary Operators
`++` `--` `+` `-` `!`
- Type Casting
- 乘 除 mod
`*` `/` `%`
- 加減法
`+` `-`
- Relational Operators
`<` `>` `<=` `>=`
- Equality Operators
`==` `!=`
- AND
`&&`
- OR
`||`
- Assignment Operators
`=` `*=` `/=` `%=` `+=` `-=`