# 程式的架構 在 [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`