---
# System prepended metadata

title: 運算式與運算子
tags: [APCS與競賽入門]

---

# 運算式與運算子

---

## 前言

學了前面的兩個章節，或許你會有以下的疑惑:學習程式到底可以幹嘛?我會輸入變數，輸出字元，這樣就沒了嗎?不要急，因為從這個章節開始，你會學習到許多很酷很炫的技能。
言歸正傳，回到本章節的主要內容。甚麼是運算式與運算子呢?簡單來講，就是你給他一些變數，他可以回傳運算的結果。
一個運算式是由運算元與運算子所構成，用以運算的資料稱為運算元，運算元可以是常數、變數、函數甚至是另一個運算式；連接運算元(告訴電腦如何運算)的符號就稱作運算子


---

## 運算子的分類1

根據所需運算子的多寡，我們可以將其分成一元運算子與二元運算子以及較為進階的三元運算子
1. 一元運算子
    - 諸如負號、否定符號等等都算是一元運算子
    - ex : -7,!A,~A等等(其中A為運算元) 
2. 二元運算子
    - 二元運算子就是我們所熟知的那一些運算子了，用法也會相對一元運算子多變
    - ex : a+b,a || b,a << b
3. 三元運算子
    - 有三個運算元，在運算上可以達到簡單條件判斷的效果
    - ex : 5/3==0 ? true : false
    - 上列的運算式如果5/3是零的話就會回傳true，否則回傳false


---

## 運算子的分類2
除了可以依據運算子的數量分類以外，亦可由運算子的功能來進行分類，主要可以粗略地分成"算術運算子"、"比較運算子"、邏輯運算子"、等等
1. 算術運算子
    - 常見的+,-,*, / 都算是算術運算子，另外還有進行位元運算的也是，這類的運算子會回傳較多元的運算結果
3. 比較運算子
    - <,==,>等都是比較運算子，這類運算子的運算結果比較單調，僅有0(False)和1(True) 
5. 邏輯運算子
    - and, or, not都算是邏輯運算子。這類運算子的功用是進行邏輯的運算(~~廢話~~)，回傳的結果也僅有0和1 

以下會詳細介紹各個運算子的功能、使用方法、例子等等。
但由於運算子真的太多了，有的運算子相當的冷門。因此僅會挑幾個重要的來講。

---

## 一元運算子

僅僅使用一個運算元的運算子(~~好饒舌~~)，基本上都是改變正負而已，在程式比賽中較為常見的也有**遞增和遞減運算子**。常見的一元運算子有`!、~、++、--`<font color="red">注意沒有`**`和`//`兩種運算子</font>(應該很好理解因為*1和/1還是原本的數字)
以下為使用方法
``` cpp=
for(int i=0;i<n;++i){
    //++i代表將i的值增加1
    //!運算子代表"否"，亦即當x不是0時if內的條件會成立
    if(!x){
        cout<<"x不是0";
    }
}

```
以上僅是相當簡單的範例，但是相當重要。運算子一定要弄懂，不然後面的許多章節中的範例程式碼都會無法理解。

---

## 二元運算子
顧名思義，二元運算子有兩個運算元，它可以是**比較運算子**，也可以是**算術運算子**，亦或者**邏輯運算子**。算術運算子的回傳通常是兩個運算元進行加減乘除等運算的結果；比較運算子與邏輯運算子回傳的是兩個運算元之間的關係。

### 算術運算子

舉凡+ , - , * , / , % 都算是算數運算子，大致可以歸結出幾個重點:

- \+ , - , * , / 四個運算子回傳的是兩運算元的和、差、積、商
- 在除法運算中如果除數為零回編譯錯誤CE(compile error)
- 除法運算為無條件捨去
- %運算子進行的是模運算，a%b代表a除以b的餘數
- %0也會出現問題喔

另外，有一個相當特別的運算子-括號。括號運算子有許多用途，可以用來進行函式的呼叫、強制型態別轉換等等。他也可以配合算術運算子使用。
比較特別的是不會有這種用法  { [ ( 1+2 ) - ( 2+4 ) ] * ( 7+24 ) } ，因為[ ] 適用在陣列  ( 以後會講 ) 的存取，{  } 則是用在標示述句的範圍。

以下為範例程式碼:
```cpp
while(a>=4){
    a=b+1;
    b--;
}
```
 

---

## 運算式
什麼是運算式呢?運算式的定義是:運算元加上運算子就會變成運算式。



<, >, <=, >=, ==, !=
前面兩個大家應該很熟悉，就是大於小於，第三第四個可能沒看過，但很好理解，就是加了一個等於而已，然而最後兩個大家就不一定知道了，他們分別是數學的等於和不等於，因為＝有指定的意思所以用 == 來表示一般的等於啦！


----

```

----

另外還有一些特別的運算子提供名稱及範例以供參考

----

, 分隔符號
ex : 
```cpp
int a=1,b=0,c=5; // 宣告變數
if(c==5)//不想用{}時
    a++, b++;
``` 

----

= 指定 ( 用於變數 )
```cpp
b=2;
int a=b+2;// 最後a=4
```

----

. 存取 ( 以後 struct 和 class 用的)
```cpp
struct position{
    int x,y; 
};

int main(){                                  
    position pos; // 宣告物件          
    pos.x=0;      // ( 結構 )             
    pos.y=2;                                 
    return 0;
}
```

----

<<, >> 輸入輸出
```cpp
cin>>a>>b;
cout<<a<<" + "<<b<<" = "<<a+b;
```

----

+=, -=, *=, /=, %= 運算加指定
ex : 
```cpp
a+=b    // 等同於 a=a+b
a*=a-b  // 等同於 a=a*(a-b)
```

----

<<, >> 位元移動 ( 用於變數 )
ex : 
```cpp
int a=1;   // 000000000001
a<<10;     // 010000000000
cout<<a;   // 會顯示 1024
```

----

&&, || and 和 or
ex : 
```cpp
int a=0,b=10;
a>=0 && b<=1000 //true
```

----

&, | 位元 and or ( 不常用 )
ex : 
```cpp
int a=13,b=10;
a&1 ;// =1  0001101 & 0000001 = 0000001
b|1 ;// =11 0001010 & 0000001 = 0001011
```

----

`++`, `--` 遞增 遞減(`C` & `C++`才有)
ex : 
```cpp 
a++;// a+=1
a--;// a-=1
```

---

以上就是常見的運算子。

以下是計算兩點距離的範例，其他像是 if for while都會用到這些運算子。

```cpp=
#include<iostream>
#include<cmath>
using namespace std;

struct position{
    double x,y;
}

int main(){
    double d;
    position a,b;
    
    cin>>a.x>>a.y;
    cin>>b.x>>b.y;

    d+=(a.x-b.x)*(a.x-b.x);
    d+=(a.y-b.y)*(a.y-b.y);
    
    d=sqrt(d);// sqrt為內建函式(平方根)
    cout<<d;
}
```

---

## 習題

###### tags: `APCS與競賽入門`