C++ 入門指南 4.01
單元 1 - 認識 C++ 語言
使用 C++ 語言寫程式,最簡單的方式就是開啟文字編輯器 (text editor) ,然後將原始程式碼逐字元一個一個打進文字編輯器中,然後依純文字檔案的編碼儲存檔案, C++ 程式的原始碼檔案可用 .cc 、 .cpp 、 .cxx 、 .c++ 等各種副檔名 (file extension) ,本書採用的是 .cxx
「程式檔案名稱」視平台及編譯器 (compiler) 是否支援中文,如果平台或編譯器不支援中文的話,那就只能用英文取檔名。
以下是用 Windows 11 系統的 Atom 輸入第一個範例 demo.cxx
由於 C++ 編譯器的版本眾多,各種編譯器支援不同的副檔名,因此才會有這個多種的副檔名。
也可以利用具有語法高亮度顯示的文字編輯器,或是整合開發環境 (Integrated Development Environment, IDE) ,如下圖為 Windows 11 系統的 Geany
Geany 屬於輕量級的整合開發工具,具有各平台的版本,同時介面上也對初學者友善,如何安裝請參考安裝 Geany 及設定字型、配色方案。
自己寫程式用文字編輯器還是 IDE 好呢?只能說青菜、蘿蔔,每個人各有所好。有些 IDE 直接整合編譯器,例如我們在後面「GUI 篇」要介紹的 Qt Creator ,倒是使用 IDE 還要學一下 IDE 的使用,有點麻煩。我們建議不妨先利用具有語法高亮度的輕量級 IDE ,等學到後面再決定要不要轉換到大型 IDE 囉!
使用本書的語法高亮度顯示,此範例程式 demo.cxx 如下
// 引入標準程式庫中相關的輸入、輸出程式 #include <iostream> // std 為標準程式庫的命名空間 using namespace std; int main(void) { // 下面建立名稱為 m , string 型態的物件 // 小括弧為 string 的建構子,雙引號為字串字面常數 string m("There is no spoon."); // cout 用來輸出的物件, endl 為新行符號 '\n' cout << endl << m << endl << endl << endl; // 最後回傳 0 給作業系統 return 0; } /* 《程式語言教學誌》的範例程式 http://kaiching.org/ 檔名:demo.cxx 功能:示範簡單的 C++ 程式 作者:張凱慶 */
本書採用 Pygments 工具建立語法高亮度,部分微調,詳細請參考官網 Welcome! - Pygments 。
我們先看到有紫紅色標記的幾行,先是第 5 行
using namespace std;
第 7 行
int main(void) {
還有第 16 行
return 0;
using 、 namespace 、 int 、 void 、 return 被稱為關鍵字 (keyword) ,所謂的關鍵字是語法功能的保留字 (reserved word) ,具有既定特殊的用法,例如 using 與 namespace 為命名空間的指令, int 為基本內建型態 (primitive built-in type) 中的整數 (integer) , void 被用來宣告 (declare) 空的參數列 (parameter list) 或沒有回傳值 (return value) 。 C++20 共有 97 個關鍵字,我們接下來會介紹各類關鍵字的用法。
另外,第 10 行雙引號圍起來的內容為紅色
string m("There is no spoon.");
這是字串 (string) 字面常數 (literal) ,所謂的字串就是文字資料,字串內容可以是任何輸入字元。
註解 (comment) 在語法高亮度系統則是綠色,連續兩個斜線為單行的註解,這出現在第 1 行、第 4 行、第 8 到 9 行、第 12 行及第 15 行,以下為第 1 行的註解
// 引入標準程式庫中相關的輸入、輸出程式
斜線、星號開始到另一組星號、斜線結束的範圍則為跨行的註解,這出現在第 19 到 23 行
/* 《程式語言教學誌》的範例程式 http://kaiching.org/ 檔名:demo.cxx 功能:示範簡單的 C++ 程式 作者:張凱慶 */
所謂的註解就是在程式中輔助說明的文字,凡是註解文字,也就單行連續兩個斜線之後的文字,或是多行斜線、星號範圍間的文字,這些文字都不屬於會被程式執行的部份,因此可用自然語言替程式說明,無須恪守 C++ 的語法規則。
還有一種深咖啡色的標記,我們用深咖啡色標示前置處理器,像第 2 行
#include <iostream>
這是用前置處理器 (preprocessor) 指令 #include 引入程式中所使用的程式庫標頭檔 (header file) 。
至於數字用藍色,例如第 15 行的 0
return 0;
其他黑色都是識別字 (identifier) ,包括來自標準程式庫 (standard library) 的識別字,或是系統保留的識別字,像是第 7 行的 main()
int main(void) {
第 10 行的 m 是自行定義的識別字
string m("There is no spoon.");
至於 std 、 string 、 cout 、 endl 等都是標準程式庫的識別字,跟自行定義的識別字與運算子 (operator) 都採預設的黑色,至於字面常數如字串或數字用不同顏色標記。
所謂的識別字是我們寫程式自行定義的名稱,如上面的變數 (variable) m ,至於 main() 為函數 (function) 名稱,每個可執行的 C++ 程式都必須有個 main() 函數,關鍵字 void 則表示 main() 不需要參數 (parameter) ,其為空的參數列。
這裡, main() 的小括弧留空也同樣表示空的參數列。
標準程式庫提供許多已經寫好、測試無誤的程式,因此我們寫程式引入標準程式庫,也就是利用前置處理器指令 #include 進來,像是 string 為類別 (class) 名稱, cout 為輸出到標準輸出裝置的物件 (object) , endl 則是新行符號。
<< 是輸出運算子 (output operator) 。
這個範例很簡單,大體上我們可以分成五個區域來看,分別是
- 引入標準程式庫
- 宣告使用命名空間
- 宣告 main() 函數
- 建立字串物件
- 於命令列印出訊息
C++ 把輸入與輸出的功能都放到標準程式庫之中,因此使用相關程式需要先引入進來,這需要使用前置處理器指令 #include ,輸入與輸出相關的程式放在 iostream 裡,角括弧 <> 表示這是從標準程式庫中引入的。
由於標準程式庫中的所有名稱都是定義在 std 命名空間 (name space) 之中,如果沒有使用 using 與 namespace 的話,程式就得這樣寫
int main(void) { // 下面建立名稱為 m , string 型態的物件 // 小括弧為 string 的建構子,雙引號為字串字面常數 std::string m("There is no spoon."); // cout 用來輸出的物件, endl 為新行符號 '\n' std::cout << std::endl << m << std::endl << std::endl << std::endl; // 最後回傳 0 給作業系統 return 0; }
:: 是作用域運算子 (scope operator) 。
可執行的 C++ 程式都需要有個 main() 函數,主要因為程式是由作業系統呼叫 main() 來執行的,因此我們自己設計程式時,都得把程式執行的部份放到 main() 當中。若程式檔案少了 main() 函數,這個程式檔案編譯後是無法被執行的。
下面建立一個 string 物件,由於 C++ 是強型態的程式語言,因此變數使用前都要宣告是什麼型態。這裡是用 string 的建構函數 (constructor) 建立 string 物件,然後用字串字面常數當作建構函數的參數,初始化 string 字串 m 的內容為 There is no spoon. 。結尾需要用分號,一行分號結尾的程式就是一個陳述 (statement) ,陳述是程式執行的單位, C++ 程式是一行陳述執行完畢,才接著下一行陳述繼續執行。
最後在命令列印出訊息,這是利用標準程式庫中的 cout 物件,後面空一格接輸出運算子 << ,先是空行符號 endl ,然後 m ,再來連續三個 endl ,最後以分號結束。
接下來,我們來看看如何編譯與執行吧!
中英文術語對照 | |
---|---|
整合開發環境 | Integrated Development Environment, IDE |
類別 | class |
註解 | comment |
編譯器 | compiler |
建構函數 | constructor |
宣告 | declare |
副檔名 | file extension |
函數 | function |
標頭檔 | header file |
識別字 | identifier |
整數 | integer |
關鍵字 | keyword |
字面常數 | literal |
命名空間 | name space |
物件 | object |
運算子 | operator |
輸出運算子 | output operator |
參數 | parameter |
參數列 | parameter list |
前置處理器 | preprocessor |
基本內建型態 | primitive built-in type |
保留字 | reserved word |
回傳值 | return value |
作用域運算子 | scope operator |
標準程式庫 | standard library |
陳述 | statement |
字串 | string |
文字編輯器 | text editor |
變數 | variable |
重點整理 |
---|
1. 寫程式可以用文字編輯器或整合開發環境。 |
2. C++ 的標準程式庫中有大量開發好、測試無誤的程式,可以直接引入使用。 |
3. 字串為雙引號圍起來的文字內容。 |
4. 連續兩個斜線為單行註解,一個斜線加一個星號到一個星號到一個斜線則是多行的註解。 |
5. 所有可執行的 C++ 程式需要定義 main() 函數。 |
6. C++ 是強型態的程式語言,使用變數前需要先宣告,物件用建構函數建立。 |
問題與討論 |
---|
1. 可以用 Word 寫程式嗎?有什麼不方便的地方呢? |
2. 程式語言除了編譯式的 C++ 外,還有直譯式的程式語言,這種程式語言是直接執行儲存程式的純文字檔案,請將直譯式與編譯式的程式語言各舉五種出來。 |
3. 想想看應該替程式碼提供哪些註解?什麼地方需要?什麼地方又不需要? |
4. C++ 是物件導向程式語言,除了 C++ 還有其他的嗎? C 語言是嗎? Python 是嗎? Fortran 呢? |
5. 物件是程式設計的中文術語,英文原文為 object ,其實 object 就是一般中文所用「東西」的意思,想一想平常我們是怎麼運用「東西」的,「東西」的概念如何移植到程式設計的物件中? |
練習 |
---|
1. 將上述範例的內容逐字元打到文字編輯器裡,然後將檔名存成 demo.cxx 。 |
2. 刪除 demo.cxx 中所有單行註解,並將檔名存成 exercise0101.cxx 。 參考程式碼 |
3. 承上題,移除 exercise0101.cxx 中的 using namespace std; ,將檔名存成 exercise0102.cxx 。 參考程式碼 |
4. 承上題,將 exercise0102.cxx 中所有 string 、 cout 、 endl 加上前綴 std:: ,把檔名存成 exercise0103.cxx 。 參考程式碼 |
5. 承上題,將 demo.cxx 中變數 m 改設定成 "Free your mind." ,把檔名存成 exercise0104.cxx 。 參考程式碼 |
6. 將 demo.cxx 中變數 m 改設定成自訂字串內容,把檔名存成 exercise0105.cxx 。 參考程式碼 |
7. 承上題,在印出 m 之前與之後加入其他自訂字串內容,此時輸出方面可改成多行以利排版,把檔名存成 exercise0106.cxx 。 參考程式碼 |
8. 承上題,利用 getline() 函數可以取得使用者輸入的整個句子, getline() 需要兩個參數,第一個參數為 cin 物件,第二個參數則是用來儲存輸入字串的變數,將 m 改成使用者輸入的字串內容,把檔名存成 exercise0107.cxx 。 參考程式碼 |
9. 承上題,將註解改成適當內容,可新增或移除原本的註解,把檔名存成 exercise0108.cxx 。 參考程式碼 |
10. 承上題,想一想怎麼避免使用者直接按下 Enter 鍵,把設計好的程式儲存在 exercise0109.cxx 檔案中。 參考程式碼 |
相關教學影片