運算子 Operator

運算子 operator 是什麼呢?

其實在 C++ 中,最簡單的運算子就是加 +、減 -、乘 *、除 /。其他比如說 <<,或是等於 =,或是 ++,這些也都是比較常見的運算子。

基本上,運算子可以依功能分為三類:

  • 算數
  • 邏輯
  • 比大小

接下來,就讓我們來看看每一類中有哪些比較常見的運算符吧!

算數

運算子 功能
+ 加法
- 減法
* 乘法
/ 除法
% 取餘數
++ 自身變數+1
-- 自身變數-1

測試範例

int main() {
    int x, y;
    x = 12;
    y = 5;

    std::cout << "x + y = " << x + y << std::endl;
    std::cout << "x - y = " << x - y << std::endl;
    std::cout << "x * y = " << x * y << std::endl;
    std::cout << "x / y = " << x / y << std::endl;
    std::cout << "x % y = " << x % y << std::endl;

    // x++ 跟 ++x 差別在哪呢?
    std::cout << "x++ = " << x++ << std::endl;
    std::cout << "++x = " << ++x << std::endl;

    return 0;
}

輸出結果

x + y = 15
x - y = 7
x * y = 60
x / y = 2
x % y = 2
x++ = 12
++x = 14

討論

首先讓我們先來討論除法,有注意到什麼奇怪的事嗎?

以數學來說,12/5 出來的結果應該是 2.4,但為什麼我們的程式跑出來結果只有2呢?

這是因為我們的 xy 都是整數,所以程式在做運算時,算出來的結果也一定是整數。因此,原本的結果 2.4,小數點後面的數就會被自動省略變為 2。

那麼下一個問題就來了,我們會問說有沒有其他方法可以讓結果輸出為2.4呢?當然有!也就是把 xy 都設為 float 浮點數。這麼一來,我們算出來的結果就會有小數點了!

接著我們來討論運算子 ++,在程式中我們可以發現我們將 ++ 分別擺放在不同的位置,而這也造成了輸出結果的不同。

其實,如果將 ++ 擺放在變數之前,那就是代表先進行 +1 的動作,再執行該行程式碼。

若是擺放在變數之後,則代表先執行該行程式碼,執行完後再將變數 +1。

因此,std::cout << "x++ = " << x++ << std::endl; 這段程式碼就是在說,先把變數 x 印出來,再執行 +1。所以 x 在下一行才會輸出 14。

邏輯

運算子 功能
&& 且。兩邊表達式必須都為 true 結果才會是 true,否則為 false
|| 或。兩邊表達式必須都為 false結果才會是 false,否則為 true
! 否。反轉表達式

測試範例

int main() {
    bool result;

    result = true && true;
    std::cout << "true && true is " << result << std::endl;

    result = true || false;
    std::cout << "true || false is " << result << std::endl;

    result = !false;
    std::cout << "!false is " << result << std::endl;

    return 0;
}

輸出結果

true && true is 1
true || false is 1
!false is 1

討論

在輸出結果中我們可以看到,輸出的結果並非印出 true 或 false,而是 1 或 0。

這是因為在 C++ 甚至是大部分的程式語言中,電腦視 1 為 true,而 0 為 false。

因此,這行程式碼 bool result = 1 && 0; 也是有效的,然而因為可讀性,我們並不建議這麼宣告。

比大小

運算子 功能
> 大於
< 小於
>= 大於等於
<= 小於等於
== 相等於
!= 不等於

測試範例

int main() {
    int x = 12;
    int y = 5;

    std::cout << "x < y is " << (x < y) << std::endl;
    std::cout << "x < y is " << (x < y) << std::endl;
    std::cout << "x >= y is " << (x >= y) << std::endl;
    std::cout << "x <= y is " << (x <= y) << std::endl;
    std::cout << "x == y is " << (x == y) << std::endl;
    std::cout << "x != y is " << (x != y) << std::endl;

    return 0;
}

輸出結果

x < y is 0
x < y is 0 x >= y is 1
x <= y is 0
x == y is 0
x != y is 1

運算子鏈結

在 C++ 中,我們可以串接多個運算子,而且,運算子彼此之間也有順序性。比如說在數學中的先乘除後加減也同樣可以套用在 C++ 中。

因此,這行程式碼 int x = 3 * 2 + 9 / 3 就會讓我們的 x 為9。不過我們也可以應用括號來改變順序,比如說 int x = (3 * 2 + 9) / 3,這樣我們的 x 就會是 5 了。

總結

這章我們看到變數要如何和運算子做結合,也了解到程式語言中有哪幾種常見的運算子。運算子的出現也為原本無聊的變數增加了幾分色彩。

在下一章,我們會來介紹 C++ 中更為進階的概念:陣列。