程式 (program) 裡需要自行命名的識別字 (identifier) 非常多,例如變數 (variable) 、函數 (function) 、類別 (class) 、成員 (member) 等等
#include <string>
using namespace std;
int main(void)
{
string m("There is no spoon.");
cout << endl << m << endl << endl << endl;
return 0;
}
以上用紅色框起來的字都是識別字。
有些名稱是自行定義的,有些名稱則屬於標準程式庫 (standard library) 中已經定義好的,例如 string 、 cout 等。標準程式庫是依 C++ 標準隨編譯器 (compiler) 提供的程式庫 (library) ,提供非常多樣的功能,例如資料結構、處理時間、輸入輸出、圖形介面、網路通訊等,我們在需要時可以引入所需的程式庫,無須自行開發相同或類似的程式。
標準程式庫裡頭的東西都是開發完成、測試無誤的,很多經常使用的程式都無須從頭開發自己的版本,這個好處大大節省了我們開發軟體的時間。
我們自行定義的識別字應避免與標準程式庫中的相同,如果我們定義相同的識別字名稱,雖然可以通過編譯,但容易造成混淆或名稱衝突,因此應避免,例如以下程式
#include <iostream>
using namespace std;
int main(void) {
// 變數 string 用到跟程式庫相同的識別字
char string[] = {'h', 'e', 'l', 'l', 'o', '\0'};
cout << endl << string << endl << endl << endl;
return 0;
}
/* 《程式語言教學誌》的範例程式
http://kaiching.org/
檔名:wrong_name.cpp
功能:示範錯誤的命名
作者:張凱慶 */
這個例子中我們用 string 當變數 (variable) 名稱,編譯執行都是沒有問題的
但是當我們要用到標準程式庫中的 string 來宣告變數時,這裡就會產生名稱衝突。簡單說, demo2.cpp 的 main() 已經有 string 當區域變數,之後再用任何 string 都是指已經建立的區域變數 string ,而非標準程式庫中的 string 類別,因而造成標準程式庫中的識別字 string 無法使用。
至於識別字命名是採用英文二十六的大小寫字母為主,另加上數字、底線符號,如下
_ | ||||||
a | b | c | d | e | f | g |
h | i | j | k | l | m | n |
o | p | q | r | s | t | u |
v | w | x | y | z | ||
A | B | C | D | E | F | G |
H | I | J | K | L | M | N |
O | P | Q | R | S | T | U |
V | W | X | Y | Z | ||
0 | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 |
基本上變數或識別字的命名習慣以簡單、清楚為原則,常見的就是小寫英文單字
iter
total
screen
rfind
或是以底線連接的英文單字組合小寫英文單字
exam_score
test_result
my_file
find_first_of
數字不能當作識別字的開頭,另外建議識別字不要用連續兩個底線命名。
每個英文單字之間也不可以有空格,空格是區別兩個程式中記號 (token) 的符號。
型態 (type) 使用的識別字,例如類別 (class) 、結構 (structure) 、列舉 (enumeration) 等,這些比較常採大寫駝峰型 (upper camel case)
SimpleGame
MyStory
ThreadTestDrive
RunThreads
函數的命名也是以大寫駝峰型為主,第一個單字通常採動詞
DoSomething()
Rotate()
LoadRecord()
ForgetIt()
另外簡單的函數,或是類別裡的存取函數 (accessor) 或修改函數 (mutator) ,比較常用英文小寫字母組合
set_number()
get_number()
is_present()
gcd()
以上舉出一些基本常見的命名習慣,許多也見於標準程式庫中,至於其他第三方程式庫可能有不同的命名習慣,例如我們在 GUI 篇要介紹的 Qt , Qt 在函數的命名習慣部分,偏向小寫駝峰型 (lower camel case)
actionPerformed()
setUpNetworking()
getField()
myField()
當然仔細來講,標準程式庫跟其他第三方程式庫的命名習慣可能還有很多不同,倒是我們先要掌握基本的命名規則,日後學習其他的程式庫再去熟習命名習慣囉!
程式的每一行都要以分號結尾,若是漏打分號的話,編譯器還會中斷編譯,並且提供警告訊息,因為有分號結尾的程式碼,在 C++ 稱之為陳述 (statement) ,簡單的陳述可由運算式 (expression) 組成,接下來我們開始介紹運算式與陳述囉!
相關教學影片
中英文術語對照 | |
---|---|
程式 | program |
識別字 | identifier |
變數 | variable |
函數 | function |
類別 | class |
成員 | member |
標準程式庫 | standard library |
編譯器 | compiler |
程式庫 | library |
記號 | token |
型態 | type |
結構 | structure |
列舉 | enumeration |
大寫駝峰型 | upper camel case |
存取函數 | accessor |
修改函數 | mutator |
小寫駝峰型 | lower camel case |
陳述 | statement |
運算式 | expression |
重點整理 |
---|
1. 自行命名的識別字應該避免與標準程式庫中相同。 |
2. C++ 接受的命名符號包括底線、大小寫英文字母及數字。 |
3. 識別字多採有意義的英文單字組合,型態、函數名稱多採大寫駝峰型,變數、簡單的函數則用小寫英文字母組合。 |
4. 第三方程式庫如 Qt 的命行習慣,不見得會和標準程式庫中相同。 |
5. 分號為陳述的結尾,漏打分號會產生編譯錯誤。 |
問題與討論 |
---|
1. 數字為什麼不可以當作識別字的起始字元? |
2. 為什麼建議識別字中不要用連續兩個底線? |
3. 為什麼識別字中不可以有空格? |
4. 為什麼命名變數要用有意義的英文單字? |
5. 大寫駝峰型跟小寫駝峰型的差別在哪裡?為什麼要有不同的命名習慣? |
練習 |
---|
1. 寫一個程式 exercise0501.cpp ,用數字當變數的起始字元,例如 2m ,觀察編譯結果。 |
2. 寫一個程式 exercise0502.cpp ,用底線當變數的名稱,例如 __ ,觀察編譯結果。 |
3. 寫一個程式 exercise0503.cpp ,設計一個 int 變數 apple_num ,然後把 apple_num 中的底線改成空格,觀察編譯結果。 |