---
# System prepended metadata

title: '[C++] 開始 C++ 的旅程'
tags: [C++]

---

# [C++] 開始 C++ 的旅程
###### tags: `C++`

為了省去一些麻煩，可以用[這個網站](https://www.onlinegdb.com/online_c++_compiler)來編譯C++程式碼。

## Hello world!

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

int main(){
    /* 
    print hello message
    133221333123111
    */
    cout << "Hello world!" << endl;
    // return value 0
    return 0;
}
```
以上就是一支 C++ 的 Hello world! 程式。我們一行一行剖析這支程式：
* 第 1 行：用來載入和輸入輸出相關的標頭檔。
* 第 2 行：告訴系統你要使用`std`這個命名空間。至於什麼是命名空間，我們稍後會再說明。
* 第 4 行~第 12 行是主程式：
    * 第 5 行~第 8 行：用`/*`和`*/`包夾起來的是註解。如果註解為單行，也可以像第 10 行那樣使用`//`並在同一行的後面寫上註解。
    * 第 9 行：印出`"Hello world!"`字串。`cout`是定義在`std`命名空間用來輸出東西的方法；`endl`則是換行符號。
    * 第 11 行：因為`main`的回傳型態宣告為`int`（這是規定在C++的標準中的，可以參考[這篇](https://blog.moli.rocks/2016/12/15/why-should-main-return-in-c/)），所以要`return`一個值，這邊我們回傳`0`代表執行成功。


跟 Python 相比，C++ 似乎囉嗦了點。在語法上，C++ 和 Python 有許多不同的地方，特別是要注意以下幾點：
1. C++ 每一行的結尾要加上分號（`;`），除非那一行只有括弧之類的東西。
    Python 則不需要加分號。
2. C++ 的排版以自己看了舒服為主，不要寫到自己都覺得亂就可以了。所以你如果把程式全部寫在同一行，電腦也不會報錯。
    Python 則有嚴格的縮排規範，該縮排的地方沒縮排、該換行的地方沒換行，電腦都會報錯。
    
## 基本資料型態
* `bool` 布林值
* `char` 字元
* `int` 整數
* `float` 浮點數
* `double` 雙精度浮點數

## 輸入和輸出
我們用`std::cin`來控制輸入以及`std::cout`來印出東西。這些是 C++ 的標準輸入輸出流，不需要型態，會根據變數自動判別。如果有`using namespace std;`這行的話，就不需要再加上`std::`了。以下程式接受一個整數輸入，並把輸入的數字乘以2再印出來：
```cpp=
int x;
cin >> x;
cout << x << "times 2 is" << 2 * x << endl;
```
注意，如果沒有特別說明，我們的範例程式都會寫在`main`裡面：
```cpp=
#include <iostream>
using namespace std;

int main() {
    /* 主程式的程式碼寫在這裡 */
    return 0;
}
```

## 運算
C++的基本運算規則和Python相似，以下我們做個簡單的介紹。
* 加號 `+`
    可以用來進行一般的加法：
    ```cpp=
    int a = 5;
    int b = 3;
    cout << a + b;
    ```    
    也可以用來把字串（`string`）給串接起來：
    ```cpp=
    string a = "foo";
    string b = "bar";
    cout << a + b;
    ```
* 減號 `-`
    可以用來進行一般的加法：
    ```cpp=
    int a = 5;
    int b = 3;
    cout << a - b;
    ```
    但很可惜，對於`string`並沒有使用減號把相同的地方去除的功能。
* 乘號 `*`
    可以用來進行一般的乘法：
    ```cpp=
    int a = 5;
    int b = 3;
    cout << a * b;
    ```
* 除號 `/`
    可以用來進行除法。如果是整數除法，就只留下商；如果是小數除法，則是保留一些位數的小數，例如：
    * `5 / 2`會是`2`
    * `5.0 / 2.0`會是`2.5`
* 模 `%`
    除法取餘數，例如：
    * `5 % 3`會是`2`
    * `100 % 10`會是`0`
* 括號 `()`
    和數學的括號相同，括號內的部分優先算。注意到就算沒有括號，電腦也會自動先乘除後加減。如果要用括號包括號的話，同樣也是用這種小括號，例如`((1 + 2) * (3 + 4)) * 5`。
* `+=`, `-=`, `*=`, `/=`, `%=`...
    這些運算子的使用方式跟Python一樣： `x += 2` 相當於 `x = x + 2`，以此類推。
* 遞增/遞減
    注意在C++中：
    * `x = x + 1`可以寫成`x++`或`++x`
    * `x = x - 1`可以寫成`x--`或`--x`
    把`++`和`--`寫在變數的前面或後面有微妙的不同，我們以後會遇到，現在先把他們當成一樣的東西就好。
### 例題
小明有`15`張百元鈔，`20`張千元鈔，一本課本`862`元，請問他最多可以買多少本課本？剩下多少錢？請輸出：
```
He can buy 24 textbooks.
He still has 812 dollars.
```
:::spoiler 解答
```cpp=
int money = 15 * 100 + 20 * 1000;
int n = money / 862;
money -= n * 862; // or money %= 862

cout << "He can buy " << n << " textbooks." << endl;
cout << "He still has " << money << " dollars." << endl;
```
:::

## 流程控制
各種程式語言的流程控制邏輯類似，在此就不特別說明。
### [if/else](https://hackmd.io/@CLKO/HyuwnlMoZ?type=view)
### [switch/case](https://openhome.cc/Gossip/CppGossip/switchStatement.html)
### [while 迴圈](https://hackmd.io/@CLKO/Sk3nDNsiZ?type=view)
### [for 迴圈](https://hackmd.io/@CLKO/H1iyHQc2b?type=view)