# 程式的架構
在 [Hello World!](/@jack41402/c_hello_world) 這篇中,我們介紹了基礎的 C 語法。
```cpp=
#include <stdio.h>
int main(void)
{
printf("Hello World!\n");
return 0;
}
```
下面來介紹一下 C 語言這樣寫的理由。
## 函式庫
```cpp
#include <header>
```
在 `#include` 後的 `header` 我們稱作標頭檔,把 `header` 替換成自己要的標頭檔,
像是 `stdio.h` 與之後會介紹到的 `math.h` 和 `string.h` 等都是標頭檔之一。
<!--跟村民交易也是相同的邏輯。
你要買鑽石裝就要找盔甲匠、要用雞肉換綠寶石就要找到屠夫,
或是想要拿到附魔書就要找圖書管理員。
**也就是要拿到想要的東西,就要找到相對應的事物。**-->
`header` 就是跟程式說你今天要做什麼,程式就會幫你找到對應的功能。
例如今天你需要輸入與輸出,就用 `#include <stdio.h>` 跟程式說你要這些功能,
程式就會調用它並讓你使用裡面的內容。
但如果你沒有 `#include <stdio.h>`,程式就不會讓你使用輸入或輸出的功能。
透過標頭檔,我們可以連結到實現程式功能的函式庫 `library`。可以把標頭檔想成電話號碼,函式庫想成接線員,透過撥打電話來得到接線員的協助。
<!--`library` 就像字面上的意思,是圖書館的概念。
我們要學習東西,就要到網路上或是圖書館找到相關的資料,
例如今天我們要學習數學,就要去找數學的資料。-->
不過調用標頭檔與使用不是絕對的關係,
你**可以調用後不使用**,但**絕對不能不調用就使用**,這樣會出錯。
就像是我可以買了飲料後不喝他,但我不能在還沒買到飲料前就喝到飲料,不符合邏輯也喝不到飲料。
:::warning
錯誤訊息會顯示
**error: 'something' was not declared in this scope**
意思是 `something` 在此範圍未被宣告,
這裡的 `something` 可以被替換成其他東西,像是 `scanf` 或是 `printf`,
IDE 會告訴你是哪一個字詞出錯了。
:::
## 主要程式
```cpp=
int main(void)
{
printf("Hello World!\n");
return 0;
}
```
### 主程式
```cpp=
int main(void)
{
}
```
第一個詞 `int`,這是整數的意思。
在 `main` 函式中,**只能用整數型別(`int`)返回數值**,
這裡返回的數值是指主要程式中的 `return 0;`,等等會介紹到這個。
而在 `main` 函式中的 `void` 是 `空` 的意思,等同於什麼也沒有放的 `main()`。
但由於 C 語言早期版本設計不夠優良,沒有放 `void` 可能會在預期外的情況啟動主程式(e.g.帶有參數時,下學期會講),所以記得要加上 `void`。
<!--沒有放void的版本,可以在含有參數的時候啟動主程式,所以加上void會更好一些;副程式沒有放void的話會出錯([C11以上才有被修正](https://www.geeksforgeeks.org/difference-int-main-int-mainvoid/))-->
:::warning
雖然不是整數型別也可以編譯,但 IDE 會跳出 `warning`。
編譯器會自動改為整數型別,不過仍建議打上 `int main(void)`。
:::
### 程式碼
```cpp=
printf("Hello World!\n");
```
在主程式中輸入你需要的程式功能,不然程式是不會憑空做事的!
### 回傳值
```cpp=
return 0;
```
為什麼要回傳值?這是為了**告訴執行程式的上級—父程序(Parent)—程式有正確執行**。
不過 `return 0;` 不是只能回傳 0 ,也可以回傳其他整數數值,
像是 1 或是非零整數 通常代表程式執行錯誤、65 會回傳 A (ASCII碼),
還有其他在不同系統下具有不同含意的數字。
> 若不打上 `return 0;`,會有兩種可能:
>
> 1. 編譯器會自動補上 `return 0;`。
> 2. 遇到左大括號 `}` 時,回傳 0 。
>
> 不過 1. 的情況並不是所有編譯器都有,
> 所以要記得打上 `return 0;` 避免錯誤。
:::info
課堂簡報中偶爾會出現 `system("pause")`,功用是讓命令視窗停留一陣子不要馬上消失,以便觀察程式的輸出。但它不是必要的,因為新版的 IDE 都有使視窗暫留的功能。
:::
###### tags: `C language`