智合網圖總目錄-各學院
關於智合網版主
智合網沿革
價值管理學院簡介
價值管理學院總目錄
價值管理簡介
價值管理總目錄
價值的定義

2020年7月25日 星期六

C++ 程式語言簡介

C++ 程式語言又稱為 C-Plus-Plus,是一個業界標準的程式語言,其前身為 C 程式語語,C 語言並沒有包含物件導向(Object-Oriented)的概念,而 C++ 就是含入物件導向概念與功能的程式語言。所以 C 語言的翻譯器 (Complier) ,有時也可以稱為編譯器,無法編譯 C++ 的原始程式,但是可以編譯 C 的原始程式。

C++ 程式語言是一個很重要也很基礎的程式語言,此一語言也衍生出其他現在常用的程式語言,例如,Java, JavaServelet 及 JavaScript,甚至是 C#。所以建議學習程式語言時,一定要先學會 C++ 程式語言,再學習其他的程式語言。

那麼學習 C++ 語言時,是否要先學習 C 語言呢?其實並不見得一定要如此,因為目前業界所開發的應用程式大都已使用 C++ 語言,而且雖然以前用 C 語言開發的程式也不少,但是學會 C++ 語言後,也很容易就看得懂 C 程式。



想學會 C++ 程式語言,自然要先找到一個合適的程式編輯與執行的工具或整合式發展平台  (Integrated Development Environment; IDE),目前常用的 IDE 軟體發展平台包括,Eclipse, Netbeans, Microsoft Visual Studio,這三種工作皆是免費的版本,前兩個版本皆支援 Linux, Mac OS, Windows 作業系統,而 Microsoft Visual Studio 則基本上支援 Window, Mac OS 作業系統,但無法在 Linux作業系統中安裝與執行 Visual Studio,而是要在 Windows 作業系統中執行 Visual Studio ,並安裝相關的Linux 負載(即外掛程式),如此開啟的專案就可以指定編譯成可以在  Linux 中執行的程式檔了。筆者較偏好使用 Eclipse,因為筆者每天的工作環境是 Linux Ubuntu。

讀者可以參考「安裝Eclipse C/C++ Developer Toolkit」該文章,以安裝 Eclipse。

要想瞭解一個程式語言,最好的方式就是從瞭解一個範例程式開始,本範例程式稱為 Hello World,原始程式碼如下,其中每一行指令前的編號是筆者額外加上的,原始程式並無這些行號的編號:
1 #include <iostream>
2 #include <string>
3 using namespace std;
4 int main() {
5    int x,y,z;
6    x=10;
7    y=20;
8    z=x+y;
9    string s="!!!Hello World!!!";
10    cout << s << endl; // prints !!!Hello World!!!
11    cout << "x=10, y=20, therefore z=x+y=" << z << endl;
12    return 0;
13 }

我們先從第4行指令看起。
第4行到第13行所代表的是一個名為 main()的函數 (function),而一個函數其實可看作是一個工作者,也就是說你(扮演呼叫者或命令者的角色)可以要求該工作者(被呼叫者)幫你完成一些事,或者一併要將工作的結果傳回給你這一個呼叫者,以供你進一步的使用。而 int main() 中的 int 代表的是這一個函數要傳回值的資料型態(就是俗稱的資料類型)為整數。要特別注意的是,int main() 此一函數名稱 main 是系統預設特別的函數名稱,其特點在於當執行一個 C++ 程式時,會先從此一 main () 函數開始執行,也就是說 main() 函數是一個 C++ 程式的開始入口點。而一個函數中的實際工作內容指令必須要以左右大括號含括起來,而且要特別注意的是最後的右大括號後面不可以加上分號 ;,但是一般的完整指令 (instruction) 在最後一定要加上一個分號 ;。

另外,在 C++ 語言中,各指令之間不一定要分行撰寫,也就是說,各指令之間可以同時寫在一行也沒有關係,只要各指令之間用分號 ; 隔開即可,而且各關鍵字或各名稱之間,基本上要至少隔一個空白,多加幾個空白也沒有關係,因為 C++ 的編譯器會略過這些空白。而運算子與運算元之間可以不加空白,但也可以加多個空白,上述的撰寫方式 C++ 的編譯器皆可以自動辨別的出來。但是對於人類的程式開發者 (programmer) 而言,顯然分行撰寫不同的指令是較容易閱讀與偵錯 (debug) 的。

第5行指令為:int x,y,z;
其目的是宣告要建立三個資料儲存空間,其名稱分別為 x, y, z,而其可以儲存的資料型態為 int 整數。有關於 C++ 的資料型態的簡要說明,可參考此一文章:「C++ Data Types」。
一般而言,在程式中要使用一個資料,可以有兩種方式,一種是直接指定為常數 (constant),一種是使用一個變數 (variable)。常數與變數皆稱為資料 (data) 基本上都必須要找一個儲存空間 (storage space) 來存放該資料,既然是儲存空間,自然就要對該儲存空間進行設定與規範,主要的設定正規範為:第一個是要設定該空間的名稱,第二個是要設定該儲存空間的可以存放的資料類型,第三個是要設定該空間的大小。而通學在決定一個資料類型時也同時決定該空間的大小。而且一個完整的資料型態,其實是由兩個部份所組成的,第一個是資料型態的類型 (data type),第二個是資料型態的修飾詞 (modifer),而且在宣告時,修飾詞要放在資料型態的前面,當然也可以不加上修飾詞。例如,int x; short int y; 其中,變數 x 佔用的整數空間是 4 bytes,而變數 y 是宣告成較小空間的整數,所以修飾詞稱為 short,佔 2 bytes。

C++ 中的資料型態可分為三大類,第一類為基本的主要的資料型態 (Primary),是系統內建存在的,第二種是衍生的資料型態  (Devrived) ,第三種是使用者自定的資料型態 (User Defined)。

第5行指令的 int 資料型態就是屬於基本的資料型態類別之一。第6行與第7行的指令:x=10; y=20; 是分別在儲存空間 x 與 y 中存放整數 10 與 20。第8行指令:z=x+y; 是將數學運算式 x+y 的結果存入變數 z 中。

第9行指令:string s="!!!Hello World!!!";  是宣告一個變數儲存空間名為 s,儲存的內容是一個字串,內容為 "!!!Hello World!!!",資料型態為字串 string。在撰寫程式時,若要指定一個明確的字串時,前後要加上雙引號。

第10行指令:cout << s << endl; // prints !!!Hello World!!! 是輸出一些東西至「標準輸出設備:stdout」,也就是終端機螢幕,在 console 的分頁中就是顯示終端機螢幕的地方。輸出的指令為 cout,讀音為 see out,指令 cout 後面就是要填寫想要輸出的部份,每一個想要輸出的部份要以 <<  字符開頭,其後再接上真正想要輸出的內容,所以第一個想要輸出的部份 為 << s 也就是要求輸出變數 s 的內容,就是要求輸出字串 !!!Hello World!!!,第二個緊接著要輸出的部份為 << endl,而 endl 是一個特殊的字元,意思為 end line,也就是一行的結尾字符,通常就是要將其斷行換行的意思。而 // prints !!!Hello World!!! 是一個註解,以 // 開頭,是給讀者看的,C++ 編譯器是會略過不處理的。

cout是一個 C++ 才有的指令(其實就是一個系統內建的函數),但不是 C++ 編譯器會預設去找得到的函數庫,所以使用者必須要明確的告知 C++ 編譯器要到那個地方(函數庫)去尋找,所以才有第1行的指令:#include <iostream>,#include 是含入或引入的意思,一定要以 # 開頭,而<>中間的名稱就是函數庫的名稱,因為指令 cout 是包含在 iostream 函數庫中,所以才有第一行的指令。同樣時,string s="!!!Hello World!!!";這一指令,因為 string 資料型態不是C++編譯器預設認得的,所以就必須額外告知要去那一個函數庫去尋找,所以才有第2行的指令:#include <string>,也就是到 string 函數庫中去尋找。

第11行指令:cout << "x=10, y=20, therefore z=x+y=" << z << endl; 第一個輸出的部份為 << "x=10, y=20, therefore z=x+y=" 所真正輸出的是一個字串 "x=10, y=20, therefore z=x+y=",而這一個字串其實也是一個資料,在C++編譯器翻譯時也會將此一字串存入一個儲存空間,只是這個儲存空間的內容是不可以被改變的,所以稱為常數。據而推之,變數代表該儲存空間在程式的執行過程中是允許可以被改變的。而此處中的常數字串的儲存空間名稱,因為使用者沒有特別的給定名稱,所以系統會自動內部給定,使用者不用去管它。第二個輸出的部份為 << z 是輸出變數 z 的內容。第三個輸出的部份為 << endl 是輸出一個換行的符號。

第12行指令:return 0; 是此一 main() 函數回傳一個值 0 回去給呼叫此一函數者,此處就是系統本身。那麼為什麼要寫這一行指令呢?因為在定義 int main() 函數時一開頭就有指定要回傳值的資料型態為 int ,所以在函數定義區中就必須要在某處,通常是最後一行就要寫上 return這個指令。而要傳回的值為何,端看呼叫者要如何使用與看行這個回傳值了,通常 int  main()這一個每一個C++程式開始執行的起始點函數,若程式執行過程中沒有什麼問題,通常回傳值皆設為 0。若一個函數在定義時就不想回傳值,那麼資料型態就設定為 void 意思是無,例如 void main()。

第3行指令:using namespace std; 是告訴C++編譯器,本程式所使用的命名空間 (namespace) 是標準命名空間 std,此一命名空間是預設的命名空間。那麼何時會用到不同的命名空間,通常是別人或自己針對某一特定的問題所設計出來的許多程式,這些程式中通常就會包括許多自己設計的函數庫與各種變數與其它的名稱之定義,所以當撰寫一個程式時,若想史直接採用別人或自己所設計出來的那一些特定用途的程式時,就要以指令 using namespae <命名空間> 的方式來引用之。初學者,通常皆使用  using namespace std; 這一指令中的預設命名空間 std 即可。

主要網頁類別

  1. 關於智合網