2.3 運算子與運算優先順序
在掌握了基本輸入、輸出之後,我們已經具備「將資料讀進電腦」,「將處理後資料送回外界」的能力,接下來重點就是中間的「處理」,也就是運算的部分。
首先我們要認識兩個名詞:
- 運算元(operands)
- 運算子(operator)
以 2+3 為例,2 和 3 都是運算元,+ 是運算子。
我們可以把運算子想成是「運算符號」,運算元則是「運算的對象」。
指定(assign)運算子
在 C++ 中,= 不是 等於(equal) 而是 指定(assign)
a = 3 是「把 3 指定 給 a 這個變數」,而非表示「a 和 3 的值是相等的」
執行完這行後,變數 a 的值就會變成 3。
a = 3;
cout << a; // 3
運算子 = 會將其右側的運算結果,指定到左側的儲存空間。
例如 v = 3+5 是把 3+5 的運算結果指定給變數 v。
也就是說如果 = 的右側不是單純的值而是運算式,要先完成運算後,再將運算結果指定給其左側的變數。
所以,執行完這行後,變數 v 的值就會變成 8。
v = 3+5;
cout << v; // 8
想想看,以下這段程式執行後的輸出為何?
int a;
a = 3;
a = a + 2;
cout << a << endl;
其中第 2 行是把 3 指定給 a,所以執行後 a 的值為 3。
第 3 行因為 = 的右側是運算式 a + 2,因此要先完成這個運算,目前 a 的值是 3,所以 a+2 的運算結果是 5。
接著可以想像第3行變成 a = 5,所以整行執行後,a 的值為 5。
千萬不要用數學符號的角度把 = 當成「等於」去看待 a = a + 2,這行敘述,否則你會看不懂它。
練習
以下這段程式執行後,a 和 b 的值各為何?
int a = 3;
int b = 5;
a = a + b;
b = a - b;
a = a - b;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
算術(arithmetic)運算子
「乘、除」 運算子的優先權高於「加、減」運算子,也就是在運算時會 先乘除後加減。
例如:1+2*3-4; 的運算結果是 3。
和數學運算式一樣,可以加上括號指定優先運算的部分。
例如:(1+2)*(3-4); 的運算結果是 -3。
有個需要留意的地方是,不同於我們在數學課中用小括號、中括號、大括號來一層層的指定優先運算的層次。C++裡只有小括號,不管是幾層都是用小括號來表示。中括號、大括號這兩個符號是用在其他地方。
數學課裡的 $(1+2)\times[(3-4)+2]$
在 C++ 裡是 (1+2)*((3-4)+2)
整數除法
除法運算子 / 有個需要注意的地方,如果它的左、右側運算元都是整數型別,那麼其運算結果也會是整數。
cout << 5/2; 的輸出不會是 2.5,而是2.
但 cout << 5.0/2;、cout << 5/2.0;、cout << 5.0/2.0; 的輸出,都是 2.5。
取餘數
另一個只能用在整數型別的 模數(modulo) 運算子 %,是用來計算兩整數相除後的餘數。
cout << 8%3 << endl; // 2
cout << 6%2 << endl; // 0
cout << 3%7 << endl; // 3
在許多演算法中,取餘數是很重要的運算,所以這是個很重要的運算子。
關係(Relational)運算子
下一個單元開始,我們的程式碼將不再只是單純按順序一行一行執行下去,它開始可以按照條件選擇接下來要執行哪一條分支路線。
例如:如果「a大於0」那麼......則......。
那個條件在當下有兩種可能:
- 若成立,表示其為 真(true)
- 若不成立,表示其為 偽(false)
關係運算子的運算結果是 布林值(Boolean)。不同於整數型別的值有多種可能的值 ... -2, -1, 0, 1, 2, ...,布林型別的值只有兩種 true, false。
以下是六個關係運算子的作用。
| 名稱 | 運算子 | 範例 | 範例運算結果 |
|---|---|---|---|
| 等於 | == |
2==3 |
false |
| 不等於 | != |
2!=3 |
true |
| 大於 | > |
2>3 |
false |
| 小於 | < |
2<3 |
true |
| 大於等於 | >= |
2>=3 |
false |
| 小於等於 | <= |
2<=3 |
true |
邏輯(logical)運算子
&&, ||, !
位元(bitwise)運算子
&, |, ^, ~, >>, <<