---
# System prepended metadata

title: 基本語法
tags: [FoShiShi]

---

###### tags: `FoShiShi`

# 基本語法

## What
在寫`C++`時需要使用`C++`看得懂的語言來寫
:::success
就像你**對美國人講中文**，**他會聽不懂**
:::
所以我們要寫`C++`需要先學`C++`的語言
而在`C++`中的語法**有一大部分都可以用在其他語言中**
(~~這就是`C++`比`Python`好的其中一個原因~~)

## When

任何你要寫`C++`的時候
其實不只`C++`，因為這些有大部分可以延用至其他語言
反正這些都是 **最基本的地基**
至少要知道這些才可以寫出`C++`的各種其他語法

## How

我直接用**最基本的程式碼之一** ---  `hello, world`，來說明

### Hello World

`hello, world`是一段最基本的`C++`程式碼，是所有**初學者第一次接觸程式語言時寫的程式**
```cpp=
#include<iostream>
using namespace std;

int main() {
    cout << "hello, world" << endl;
    return 0;
}
```

以下來仔細分析這段程式碼：

```cpp=1
#include<iostream>
```

`#include<...>`指的是將`...`這個**函式庫**導入這段程式
導入的目的就是讓這段程式碼可以用這個**函式庫**中的**各種函式**
:::success
就像是你在圖書館，有很多種書
現在你想做一件事情，你**要先找到有傳授這種知識的書**
**讀完這本書後才能知道書中的事情要怎麼做**
:::
當然我們有很多書，也可以讀很多書，
所以有很多種的`<...>`(例：`<math.h>`、`<algorithm>`)，也可以`#include<...>`很多次

:::info
`C++`中有個"百科全書"叫做`<bits/stdc++.h>`，極為毒瘤
:::

---

```cpp=2
using namespace std;
```

其實這行的意思可以先不用管
因為講起來有點抽象
而且要講清楚需要扯到其他毒瘤東東
但反正我還是講一下
不想看的可以跳到下一個

這裡的`using namespace ...`指的是**使用命名空間**
而命名空間是什麼呢？
我來舉例好了

:::success
臺灣**有很多中正路**

臺北市士林區中正路
桃園市桃園區中正路
新竹市中正路
...

那如果我們在美國跟另一個臺灣人說：「我家在中正路」
他顯然**不知道你指的中正路是哪個中正路**

這時我們可以**限定我們命名的地方**，例如桃園市
也就是`using namespace 桃園市`
這時你說的中正路就都會是桃園的了

但這樣就會有一個問題
如果這是你需要跟其他人**說多個不同的中正路**
你**就需要一直限定、再解除限定...**
就很麻煩

那你可以在每個中正路前面加他的地方
像是：
桃園市的中正路
臺北市的中正路
也就是
`桃園市::中正路`
`臺北市::中正路`
:::

那這裡的`std`命名空間主要是用來限定`C++`標準程式庫類型和函式
這裡有限定的東西是`cout`跟`endl`
所以如果你沒有`using namespace std`
你就要把`cout`跟`endl`
改成`std::cout`跟`std::endl`

---

```cpp=4
int main() {
    ...
}
```

這是**主函式**
是**整個程式最一開始會執行的函式**
也是程式中**最主要執行操作的部分**

`....`就是放操作的地方
其他的就以上面的寫法即可
如果好奇這寫法為什麼這樣寫的
歡迎去到**函式**的講義看看(請先學完**資料型態**)

---

```cpp=5
cout << "hello, world" << endl;
```

這裡的`cout`就是**輸出(`output`)**
`C++`中`cout`的語法如下
`cout << ... << ... (可接無數次)`
可以在`cout`加上無數個`<< ...`
然後這裡的`...`可以是各種型態，像是字串、數字、運算式之類的
**並且同個**`...`**中必為同個資料型態**

:::info
這裡的`"..."`是`字串`，我們會在[**`資料型態`**](https://chrislaiisme.github.io/FoShiShi/data_types)(<font size=1px>這裡其實有超連結只是字是藍的所以不明顯</font>)淺談，
並在[**`字串`**](https://chrislaiisme.github.io/FoShiShi/string)(<font size=1px>這裡其實有超連結只是字是藍的所以不明顯</font>)中詳細的說明用法

現在先知道要用`""`包起來就好了
:::

這裡的`endl`是對輸出檔做**換行**(不是程式碼中換行)

:::info
如果記不起來`cout <<`的箭頭方向
就**把`cout`想成是一個盒子，用來裝你要輸出的東西**
然後要把`盒子 << 你想輸出的東西`
就是**把東西指進去盒子裡面**
:::

---

```cpp=6
return 0;
```

`return`用於在函式中**回傳某個值**，**同時終止函式**
:::info
**回傳**就是指你要給程式裡面的訊息，之後在 [**`函式`**](https://chrislaiisme.github.io/FoShiShi/function)(<font size=1px>這裡其實有超連結只是字是藍的所以不明顯</font>) 的時候會再講
:::
在`main`函式中`return`的目的在於停止程式，在最後確保程式能夠正常終止

:::success
就像你在跟別人講話的時候
當你要結束話題的時候
你**必須直接明白的跟他說你要結束了**
才能夠離開他，不然就很失禮

但有趣的事情來了
正常來說一個函式會在執行完所有操作後直接幫你跳出去(有些狀況不會)
所以**不加其實沒差**
就像你跟別人講話的時候
**他知道你其實講完話了**
**所以就可以理所當然地離開**
:::

如果要於某函式**回傳某值**，那就是在要**用於接收此函式的回傳值**來加以利用的時後
例：接收三角函數的回傳值來計算其他東西

---

### 其他語法

#### 輸入
剛才的`hello, world`程式碼有提及輸出也就是`cout`的語法
那 **輸入也就是`cin`** 就是你自己打出來要給程式的東西
你需要先 **宣告東西** 你才能輸入這個東西，所以會在`cin`的語法 [**`資料型態`**](https://chrislaiisme.github.io/FoShiShi/data_types) 那邊講

#### 排版
`C++`是個**弱排版程式語言**
這代表**過多的空格或縮排(`Tab`)對整體程式來說不會有影響**
相信有學過`Python`的都知道
縮排沒縮好就有可能整個爛掉
但`C++`就不會有這種問題
所以就算你不縮排對程式碼也不會怎樣(**只是你眼睛會先瞎掉**)

#### 分號
**分號很重要**
是用來**標示一個操作的結束**
所以幾乎每一行的結尾都要打上`;`的符號
但有些操作的結尾是不用加分號的
例：
`#include<...>`, `#define ... ...`
然後因為分號表示操作的結束
所以**不要在沒結束的東西後亂加分號**
例：
`int main() {` 的後面不用加(可以參考上面`hello, world`的程式碼)

#### 註解

在文字前加上`//`即可變成**註解**
例：
```cpp=
cout << "aaa" << endl; // 輸出"aaa"
```
那如果你想要註解多行
就把註解包在`/* */`中間(就算換行也可包)
例：
```cpp=
cout << "aaa" << endl;
/*輸出"aaa"
輸出完之後就結束了
剩下就剩我在這裡打的字了
雖然沒有意義但我就想打*/
```

---

## 實際應用

### 題目1

輸出`12345`並換行

:::spoiler solution

輸出用`cout`

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

int main() {
    cout << 12345 << endl;
    return 0;
}
```
:::

### 題目2

輸出`Hello C++`並換行

:::spoiler solution

字串要用`""`包起來

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

int main() {
    cout << "Hello C++" << endl;
    return 0;
}
```
:::