2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門 本章藉由兩個簡單的程式, 介紹 C++ 程式的基本結構和開發環境, 讓初學者能逐漸建立使用 C++ 的信心 1/44 C++ 的基本語法和使用環境 2.1 2.2 2.3 2.4 2.5 2.6 基本程式開發步驟第一個完整的 C++ 程式 Borland C++ 編譯器的取得和安裝使用 Visual C++.NET 程式開發步驟第二個 C++ 程式 C++ 代號的命名規則 2/44
基本程式開發步驟 1. 編輯 (edit) 2. 前處理 (preprocess) 3. 編譯 (compile) 4. 聯結 (link) 5. 裝載 (load) 6. 執行 (execute) 3/44 基本程式開發步驟示意圖 概念 編輯器 標頭檔 原始程式碼 前處理器 轉譯單元 編譯器 目的檔 程式庫 聯結器 4/44 執行結果 裝載器 執行檔
基本程式開發步驟 編譯器 (compiler) 將前置處理器處理後的中間檔 ( 轉譯單元 ), 轉譯成二進位機器碼目的檔 (.obj) 或人還看得懂的組合語言程式碼 ( 其後再呼叫 assembler, 再翻成機器碼 ) 另外並進行語法檢查和程式碼最佳化 聯結 (linking): 將目的程式聯結其他程式 ( 已經編譯成機器碼的程式片段, 內建或自行開發的程式庫 ), 產生執行檔 (.exe) 相對位址 -> 絕對位址 裝載器 (Loader): 將可執行碼放至於主記憶體內 加入.dll 2.2 第一個完整的 C++ 程式 5/44 6/44 // Test.cpp // 程式的目的是在顯示器上顯示一行文字 #include <iostream> using std::cout; using std::endl; // -- 程式主體部份 --------------------- int main() { cout << "Hello, 您好!" // 主要的敘述 << endl; return 0; } 這個程式包括了註解 (comments) 前處理指令 (preprocessor directives) 以及程式主體三個部份
6/44 7/44 註解的目的 1. 在每個檔案的開頭置入一段文字, 以便於日後追查 2. 補充說明變數和函數等自行定義的元件之意義, 以及使用上的注意事項 3. 使程式更容易閱讀 4. 將程式的某些部份暫時轉成註解, 可以不用真的把該部份程式刪除, 隨時可以恢復, 避免重複輸入 註解的兩種做法 1. 從雙斜線 // 的右邊開始, 一直到整行結束, 都視為註解 2. 以 /* 開頭, 一直到 */, 中間所包括的文數字或符號都視為註解 7/44 8/44
8/44 9/44 註解的兩種形式 /* Test.cpp 程式的目的是在顯示器上顯示一行文字 */ #include <iostream> using std::cout; using std::endl; // -------- 程式主體部份 --------------- int main() { cout << "Hello, 您好!" /* 主要的敘述 */ << endl; return 0; } 前置處理器指令 (preprocessor directives) 以符號 # 開頭的指令行在程式編譯前會由前置處理器先行處理 (i.e. 編譯程式前先做準備工作 ), 每個前置處理指令必須獨佔一行 #include <iostream> iostream.h: 標頭檔 (header file). 定義有關輸出入等串流函數資訊, 以供編譯器使用 依程式撰寫內容將 iostream.h 包進程式裡面, 以引進相關程式庫, 讓程式設計者方便使用裡面的函數 常數 運算等 使程式碼簡潔, 節省時間 常用程式庫見附錄 C
OOXX.???? **** 標頭檔 iostream XXXX.???? @@@ 標頭檔 stdlib #include <iostream> #include <stdlib> using namespace std; int main(void) { return 0; } OOXX???? **** XXXX.???? @@@ using namespace std; int main(void) {. return 0; } 編譯 前置處理器指令 (preprocessor directives) 在 ANSI/ISO C++ 最新規範中, C++ 標準函數庫 (library) 裡包含的函數 類別與物件均是定義在 std 這個名稱空間內 所以必須指明所使用的名稱空間為 std, 以便使用 C++ 所提供的標準程式庫 using std::cout std: 名稱空間 (name space) 表示使用 std 名稱空間內的 cout 函數 使用某個名稱空間內的變數或函數時, 我們必須使用 :: 把名稱空間和名稱空間內的變數或函數連在一起 名稱空間目的是為了避免大型程式間使用不同程式時, 發生變數或函數名稱重覆的問題 using namespace std;
前置處理器指令 (preprocessor directives) OOXX.???? AAA; **** 標頭檔 First.h XXXX.???? AAA; @@@ 標頭檔 Second.h #include First.h. using namespace std; int main(void) {. AAA;. return 0; } 因名稱衝突而無法引用既有程式的問題 10/44 14/44 程式主體 C++ 程式可能含有一個或一個以上的函數, 但只能有一個叫做 main 不管 main() 是不是程式中第一個出現的函數, 程式都是從 main() 開始執行 在 main() 左邊的關鍵字 int 表示 main() 的執行結果將會傳回一個整數 與程式本體內的最後一個敘述 return 0; 是對應的 完整的指令稱為敘述 (statement), 每一個敘述都是以分號結尾
cout 和 endl cout << "Hello, 您好!" << endl; cout 唸作 C-Out, 代表由標頭檔 <iostream> 定義的一個輸出資料流物件 (output stream object) 運算符號 << 稱為資料流插入運算子 (stream insertion operator) endl 是一種格式操縱子 (manipulators), 用來設定輸出格式 11/44 15/44 程式 Test.cpp 的更簡略形式 #include <iostream> using namespace std; int main() { cout << "Hello, 您好!" << endl; return 0; } 12/44 16/44
using 指令 (using directive) using namespace std; 在 using 指令之後, 所有名稱空間 std 內的標準元件都開放出來, 不再受限, 所以不需要在使用 using std:cout; 和 using std::endl; 兩個 using 宣告 13/44 17/44 C++ 程式的編排方式 下列的寫法都可以產生正確的輸出結果 : (1) #include <iostream> using namespace std; int main() { cout << "Hello, 您好!" << endl; } (2) #include <iostream> using namespace std; int main() { cout << "Hello, 您好!" << endl;} (3) #include <iostream> using namespace std; int main() { 14/44 18/44 cout << "Hello, 您好!" << endl;
15/44 19/44 延遲 DOS 視窗畫面自動關閉的方法 // TestW.cpp // 延遲 DOS 畫面自動關閉 #include <iostream> using namespace std; // 程式主體部份 int main() { cout << "Hello, 您好!" << endl; system("pause ); return 0; } 從 Windows XP 檔案總管直接以滑鼠執行 TestW.exe 16/44 20/44
Edit-Compile-Run 的程式開發流程循環 概念 Source Code Executable Code 執行結果 Edit Compile Run 17/44 21/44 使用 Borland 編譯器在 DOS 下編譯和執行範例程式 Test.cpp 18/44 22/44
Visual C++.NET 程式開發步驟 啟動 Visual C++.NET 19/44 23/44 Visual Studio.NET 的 起始頁 20/44 24/44
建立新專案 21/44 25/44 Win32 應用程式精靈 視窗 22/44 26/44
Visual Studio.NET 的設計視窗 工具列 標題 功能表 23/44 27/44 Workspace 視窗編譯訊息視窗程式碼視窗 24/44 28/44 PTest.cpp #include "stdafx.h" using namespace std; int main() { cout << "Hello, 您好!" << endl; cin.get () ; return 0; }
完成後的程式碼視窗如下圖所示 : 25/44 29/44 接著在工具列中按下 全部儲存 鈕 : 26/44 30/44
再按下工具列中的 啟動 鈕 : 27/44 31/44 要求重新編譯和執行的 Microsoft Development Environment 視窗 28/44 32/44
執行結果 29/44 33/44 開啟舊專案 30/44 34/44
插入檔案 新增檔案 視窗 31/44 35/44 加入標頭檔 32/44 36/44
另存新檔 視窗, 完成加入檔案的動作 33/44 37/44 變數的宣告和使用 所有 C++ 程式內的變數都要經由宣告才能使用 int x, y, Sum; 或 int x; int y; int Sum; // 第一個輸入整數 // 第二個輸入整數 // 兩個整數的和 34/44 38/44
宣告敘述與記憶體空間的對應關係 資料型態決定了變數佔用記憶體空間的大小 變數名稱代表記憶體所在的位址 35/44 39/44 變數宣告的兩重含意 1. 指定在記憶體內的空間大小 2. 規定這個變數所能接受的運算 36/44 40/44
變數 每個變數在記憶體內都有特定的位置, 而每個記憶體位置都有一個位址 (address/memory address) x 稱為變數的代號 ( 識別字, identifier) 當我們在程式敘述中參考到 x, 事實上操作的對象是記憶體該位址內的內容 x=x+1; = 為指定運算子 (assignment operator), 非數學上的 等於 概念 sum=x+y; (o) x+y=sum; (x) rval (right value) 和 lval (left value) 指派運算子 = 右邊的運算元稱為 rval ( 右值 ), 它必須在這個敘述處理前就有確定的值 指派運算子 = 左邊的運算元稱為 lval ( 左值 ), 準備用來存入 rval 的值 ; 它必須具有足夠的記憶空間, 而且是屬於相容的資料型態 37/44 42/44
輸入資料流物件 (input stream object) cin 用來配合資料流擷取運算子 (stream extraction operator), >>, 把來自鍵盤的輸入讀進執行中的程式 例如 :cin >> x; cin 和 cout 都是定義於標頭檔 <iostream>, 也使用 std 做為 namespace 38/44 43/44 從顯示器輸出訊息 cout << 請輸入第一個整數 \n? cout << 請輸入第一個整數 " << endl; 39/44 44/44
40/44 45/44 第二個 C++ 程式 Sum.cpp // Sum.cpp // 要求使用者輸入兩個整數, 並把計算結果輸出 #include <iostream> using namespace std; int main() { int x; // 第一個輸入整數 } int y; // 第二個輸入整數 int Sum; // 兩個整數的和 cout << " 請輸入第一個整數 \n"; cin >> x; cout << " 請輸入第二個整數 \n"; cin >> y; Sum = x + y; cout << " 這兩個整數的和是 : " << Sum << endl; return 0; 程式 Sum.cpp 的操作過程 41/44 46/44
C++ 代號 (identifiers) 的命名規則 1. 代號由英文字母 數字和底線符號 _ 構成, 長度不限 2. 英文字母的大小寫不同 3. 開頭不可以用數字 4. 不可以使用 C++ 內設的關鍵字 (keywords) 42/44 47/44 C++ 的 74 個關鍵字 43/44 48/44 and and_eq asm auto bitand bitor bool break case catch char class compl const const_cast continue default delete do double dynamic cast else enum explicit export extern false float for friend goto if inline int long mutable namespace new not not_eq operator or or_eq private protected public register reinterpret_c return ast short signed sizeof static static_cast struct switch template this throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while xor xor_eq
C++ 的代號 (identifiers) 1. 可以接受的代號 : Tax Tax_Paid TaxPaid a1 velocity A_1 _GoodDay 2. 錯誤的命名方式 : 1b %a -x 合計 asm you&me A@mail 44/44 49/44