---
# System prepended metadata

title: Operators
tags: [Java]

---

[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
  `=` `*=` `/=` `%=` `+=` `-=`