C++程序設計人員的一般起點是命令行上執行的 “Hello, world!” 應用程式。 您從本文開始,然後移至更具挑戰性的內容:計算機應用程式。
先決條件
- 您的電腦上需要安裝並運行 Visual Studio,並包含 使用 C++ 的桌面開發 工作負載。 若要安裝,請參閱 在 Visual Studio 中安裝C++支援。
- 本教學課程示範一項稱為編輯並繼續的功能,可讓您在執行應用程式時變更程序代碼。 若要啟用編輯並繼續,請從主功能表中選取 [工具>選項>>偵錯一般],並確定已核取 [要求原始程序檔完全符合原始版本]。
建立您的應用程式專案
Visual Studio 會使用 專案 來組織應用程式的程式代碼,以及組織一或多個項目 的解決方案 。 專案包含用來建置應用程式的所有選項、組態和規則。 它也會管理所有項目檔案與任何外部檔案之間的關聯性。 若要建立您的應用程式,請先建立新的專案和方案。
啟動 Visual Studio--[Visual Studio 開始] 對話框隨即出現。 選取 [建立新專案 ] 以開始使用。
對話框有複製存放庫、開啟專案或方案、開啟本機資料夾,以及建立新項目的選項。
在 [ 建立新專案 ] 對話框中,將語言下拉式清單設定為 [C++],將平臺下拉式清單設定為 [Windows],從專案類型清單中選取 [控制台應用程式 ],然後選取 [ 下一步]。
語言下拉式清單會設定為 C++,平臺下拉式清單會設定為 Windows,而 [空白專案]、[控制台應用程式]、[CMake 專案]、[Windows 桌面精靈] 等專案類型會顯示在專案類型清單中。
這很重要
請務必選取 主控台應用程式 範本C++版本。 它有 C++、 Windows 和 控制台 標籤,而且圖示在角落中有 “++”。
在 [ 設定新專案 ] 對話框中,選取 [ 項目名稱] 文本框,將新的專案命名 為 CalculatorTutorial,然後選取 [ 建立]。
已建立空的 C++ Windows 控制台應用程式 "Hello World"。 主控台應用程式會使用 Windows 主控台視窗來顯示輸出並接受使用者輸入。 在 Visual Studio 中,編輯器視窗隨即開啟,並顯示產生的程式代碼:
// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include <iostream> int main() { std::cout << "Hello World!\n"; } // Run program: Ctrl + F5 or Debug > Start Without Debugging menu // Debug program: F5 or Debug > Start Debugging menu // Tips for Getting Started: // 1. Use the Solution Explorer window to add/manage files // 2. Use the Team Explorer window to connect to source control // 3. Use the Output window to see build output and other messages // 4. Use the Error List window to view errors // 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project // 6. In the future, to open this project again, go to File > Open > Project and select the .sln file
確認新的應用程式建置並執行
新 Windows 控制台應用程式的範本會建立簡單的C++ “Hello World” 應用程式。 此時,您可以看到 Visual Studio 如何建置和執行您直接從 IDE 建立的應用程式。
若要建置專案,請從 [建置] 功能表中選取 [建置方案]。 [輸出] 視窗會顯示建置程序的結果。
若要執行程式代碼,請在功能表欄中選取偵錯>不偵錯執行(Ctrl+F5)。
主控台視窗隨即開啟,您的應用程式會在其中執行。
當您在 Visual Studio 中啟動主控台應用程式時,它會執行程式碼,然後列印「按任意鍵關閉此視窗 。 . 。“ 可讓您有機會查看輸出。
祝賀! 您已在 Visual Studio 中建立第一個 “Hello, world!” 控制台應用程式!
按下按鍵以關閉主控台視窗並返回Visual Studio。
您現在有工具可在每次變更之後建置並執行您的應用程式,以確認程式代碼仍如預期般運作。 稍後,我們會示範如何偵錯它,如果它無法運作。
編輯程序代碼
現在,讓我們將此範本中的程式碼修改為計算機應用程式。
將檔案的內容
CalculatorTutorial.cpp
取代為下列程序代碼,使其符合此範例:// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include <iostream> using namespace std; int main() { cout << "Calculator Console Application" << endl << endl; cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b" << endl; return 0; } // Run program: Ctrl + F5 or Debug > Start Without Debugging menu // Debug program: F5 or Debug > Start Debugging menu // Tips for Getting Started: // 1. Use the Solution Explorer window to add/manage files // 2. Use the Team Explorer window to connect to source control // 3. Use the Output window to see build output and other messages // 4. Use the Error List window to view errors // 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project // 6. In the future, to open this project again, go to File > Open > Project and select the .sln file
瞭解程式代碼:
-
#include
語句會將其他檔案中的程式代碼引入。 有時候,您可能會看到以角括弧括住的檔名,例如<iostream>
。 角括弧會指示編譯程式先在標準系統目錄中尋找iostream
標頭檔,如果找不到,則尋找專案特定的目錄。 其他時候,您可能會看到檔名周圍有引號,例如"someHeader.h"
。 引號會指示編譯程式略過在標準系統目錄中尋找,而只會查看專案特定的目錄。 -
using namespace std;
會指示編譯程式預期C++標準連結庫的程式代碼會用於這個檔案中。 如果沒有這一行,連結庫中的每個關鍵詞必須前面加上std::
,才能表示其範圍。 例如,如果沒有該行,每個對cout
的參考都會寫成std::cout
。 新增了using
語句,以便更方便存取另一個命名空間中的程式碼。 - 關鍵詞
cout
用於在 C++ 中列印到標準輸出。 運算子<<
會指示編譯程式將其右側的任何內容傳送至標準輸出。 - 關鍵詞
endl
就像 Enter 鍵;它會結束這一行,並將游標移至下一行。 最好是將\n
放在包含""
的字串內,以便執行相同的動作,因為endl
總是會清空緩衝區,這可能會影響程式的效能。 由於這是一個非常小的應用程式,因此改用endl
來替代。 - 所有C++語句都必須以分號結尾,而且所有C++應用程式都必須包含函
main()
式。 此函式是程式在啟動時執行的內容。 所有程式代碼都必須可從main()
存取,才能使用。
-
若要儲存盤案,請按 Ctrl+S,或選取功能表欄下方工具列中的磁碟片圖示。
若要執行應用程式,請按 Ctrl+F5 或移至 [ 偵 錯] 功能表,然後選取 [ 啟動但不偵錯]。 您應該會看到看起來如下的控制台視窗。
當您完成時,請關閉主控台視窗。
新增程式代碼以執行一些數學運算
類別就像是物件執行某些動作的藍圖。 在此情況下,我們會定義計算機類別來包含數學邏輯。
新增 Calculator 類別
移至 [專案] 功能表,然後選取 [ 新增類別]。 在 [ 類別名稱] 編輯方塊中,輸入 計算機。 請選擇 [確定]。
類別名稱欄位包含文字計算機。 .h 檔案欄位包含 Calculator.h。 .cpp檔案欄位包含Calculator.cpp。 基類欄位是空的。 內嵌和Managed的選項未被勾選。
兩個新檔案會新增至您的專案。 若要一次儲存所有已變更的檔案,請按 Ctrl+Shift+S。 這是 [全部儲存盤>] 的鍵盤快捷方式。 另外還有 [ 全部儲存] 工具列按鈕,這是兩個磁碟片的圖示,位於 [儲存 ] 按鈕旁邊 。 一般而言,最好經常執行 [全部儲存 ],因此您不會錯過儲存任何變更。
[新增類別精靈] 會
.h
建立 與 類別同名的檔案.cpp
。 您可以在 [ 方案 總管] 視窗中看到項目檔的完整清單,顯示在 IDE 側邊。 如果視窗不見,請在功能表列透過 [ 檢視>方案總管 ] 開啟它。計算機教學課程專案具有頭文件節點,其中包含 Calculator.h。 "一個 [來源檔案] 節點包含 Calculator.cpp 和 CalculatorTutorial.cpp。" 參考、外部相依性和資源文件的節點可看見,但已關閉。
您可以在 [方案總管] 視窗中按兩下滑鼠開啟檔案。 按兩下
Calculator.h
以開啟它。將 的內容
Calculator.h
取代為下列程式代碼,讓檔案現在看起來像這樣:#pragma once class Calculator { public: double Calculate(double x, char oper, double y); };
了解程式碼
- 此程式代碼會宣告名為
Calculate
的新函式,其會處理加法、減法、乘法和除法的數學運算。 - C++程式代碼會組織成 標頭 (
.h
) 檔案和 來源 (.cpp
) 檔案。 多種編譯器可支援其他副檔名,但這些是主要需要了解的。 函式和變數通常會 宣告,也就是在頭檔中指定名稱和類型,並在原始程式檔中 實作或指定定義。 若要存取另一個檔案中定義的程式代碼,您可以使用#include "filename.h"
,其中filename.h
是宣告您要使用的變數或函式的檔名。 - 最好根據程式代碼的功能將程式代碼組織成不同的檔案,以便您稍後輕鬆找到所需的程序代碼。 在我們的案例中,我們會將 類別與包含 函式的
Calculator
檔案分開定義main()
,但我們計劃參考Calculator
中的main()
類別。
- 此程式代碼會宣告名為
綠色波浪線會出現在
Calculate
,因為Calculate
函式雖然已宣告,但並未定義。 將滑鼠停留在Calculate
,按一下螺絲起子圖示上的向下箭號,然後選取在Calculator.cpp
中建立「Calculate」定義。此程式代碼會新增至
Calculator.cpp
:函式的定義是:double Calculator::Calculate( double x, char oper, double y) { return 0.0; }
目前,它只會傳回 0.0。 讓我們改變這點。
切換至
Calculator.cpp
編輯器視窗中的檔案。 將的內容Calculator::Calculate(double x, char oper, double y)
取代為:double Calculator::Calculate(double x, char oper, double y) { switch(oper) { case '+': return x + y; case '-': return x - y; case '*': return x * y; case '/': return x / y; default: return 0.0; } }
了解程式碼
- 函式
Calculate
接受數位、運算符和第二個數位。 然後,它會在兩個數字上執行要求的作業。 - 語句
switch
會檢查提供的運算子,並執行與該運算對應的情況。 此default:
情境是一個備用方案,用於當使用者輸入任何上述case
語句未處理的運算符時進行處理。 最好以更簡潔的方式處理無效的使用者輸入,但這已超出本教學課程的範圍。 - 關鍵詞
double
表示支援小數的數字類型。 這種類型的數位稱為浮點數,表示double
具有額外精確度的浮點數。 如此一來,計算機就可以處理十進位數學和整數數學。 函Calculate
式必須一律傳回雙精確度浮點數,因為程式代碼開頭的double
(這表示函式的傳回型別),這就是為什麼我們在預設案例中傳回0.0的原因。 - 檔案
.h
會宣告函式 原型,其會事先告知編譯程式需要哪些參數,以及預期其傳回類型。 檔案.cpp
具有函式的所有實作詳細數據。
- 函式
如果您此時再次建置並執行程序代碼,它會在要求執行哪個作業之後立即結束。 因此,修改函 main
式以執行多個計算。
Calculator
呼叫類別成員函式
更新
main
函式中的CalculatorTutorial.cpp
,如下所示:// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include <iostream> #include "Calculator.h" using namespace std; int main() { double x = 0.0; double y = 0.0; double result = 0.0; char oper = '+'; cout << "Calculator Console Application" << endl << endl; cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b" << endl; Calculator c; while (true) { cin >> x >> oper >> y; result = c.Calculate(x, oper, y); cout << "Result " << "of " << x << oper << y << " is: " << result << endl; } return 0; }
了解程式碼
- 由於C++程式一律從
main()
函式開始,因此我們需要從該處呼叫其他程序代碼,因此需要語句#include
,才能讓函main()
式看到該程序代碼。 - 變數
x
、y
、oper
和result
會分別宣告為儲存第一個數位、第二個數位、運算元和最終結果。 最好給他們一些初始值,以避免未定義的行為,這就是這裡完成的工作。 - 此
Calculator c;
行會將名為c
的物件宣告為 類別的Calculator
實例。 類別本身只是計算機運作方式的藍圖;對象是執行數學運算的特定計算機。 - 語句
while (true)
是迴圈。 只要內部的條件()
為 true,迴圈內的程式代碼就會重複執行。 由於條件只是列為true
,因此一律為 true,因此循環會永遠執行。 若要關閉程式,用戶必須手動關閉控制台視窗。 否則,程式一律會等候新的輸入。 - 關鍵詞
cin
接受來自用戶的輸入。 輸入數據流足夠聰明,可以處理主控台視窗中輸入的一行文字,並依序放在列出的每個變數內。 - 表達式
c.Calculate(x, oper, y);
會呼叫Calculate
稍早定義的函式,並提供輸入值和要求的作業。 然後,函式會傳回儲存在 中的result
數位。 - 最後,
result
會列印到主控台,而使用者會看到計算的結果。
- 由於C++程式一律從
再次建置並測試程序代碼
現在再次測試程式,以確保一切正常運作。
按 Ctrl+F5 重建並啟動應用程式。
輸入
5+5
,然後按 Enter。 確認結果為 10。應用程式輸出訊息:請輸入要執行的作業。 格式:a+b |a-b |a*b |a/b. 用戶輸入 5+5。 應用程式輸出:5+5 的結果是:10
關閉主控台視窗以停止程式。
對應用程式進行偵錯
由於使用者可以在主控台視窗中輸入任何內容,因此讓我們確保程式可以處理非預期的輸入。 讓我們不要執行程式,而是進行偵錯,以便我們可以檢查其執行逐步執行的內容。
在調試程式中執行應用程式
在
CalcuatorTutorial.cpp
中,在行上設定斷點:result = c.Calculate(x, oper, y);
。 若要設定斷點,請按兩下編輯器視窗左邊緣灰色垂直線旁的線條,讓紅點出現。現在當我們偵錯程式時,執行會暫停在該行。 我們已經有一個粗略的想法,程式適用於簡單的案例。 由於我們不想在每次呼叫
Calculate()
時暫停執行,因此讓我們設定斷點條件。以滑鼠右鍵按兩下代表斷點的紅點,然後選取 [ 條件]。 在條件編輯方塊中, 輸入
(y == 0) && (oper == '/')
。 選取 [ 關閉 ] 按鈕以儲存斷點條件。斷點位於行上:result = c dot Calculate (x, oper, y)。 '條件...' [條件] 選項已勾選。 [條件] 下拉式清單會設定為 [條件運算式]。 條件下拉式清單會設定為 「Is true」。 條件設定為 y == 0 && oper == '/'。
現在,當應用程式嘗試除以 0 時,執行會在斷點暫停。
若要偵錯程式,請按 F5,或選取具有綠色箭號圖示的本機 Windows 調試程式調試程式 工具列按鈕。 在主控台應用程式中,如果您輸入類似 「5 - 0」 的內容,則程式會正常運作並持續執行。 不過,如果您輸入 「10 / 0」,它會在斷點暫停。 您可以在運算符和數字之間放置任意數目的空格:
cin
足夠聰明,可以適當地剖析輸入。
調試程式中有用的視窗
當您對程式代碼進行偵錯時,您可能會注意到會出現一些新的視窗。 這些視窗可協助您的偵錯體驗。 查看 Autos 視窗。 [ 自動變數] 視窗會顯示目前至少使用三行的變數值,且最多是目前這一行。 如果您沒有看到 [自動變數] 視窗,請從主功能表選取 [偵>錯Windows>Autos]。
oper 的值是 47 '/',結果為 5、x 為 10,而 y 為 0。
若要查看該函式中的所有變數,請切換至 [ 局部變數 ] 視窗。 因為這是小型函式,[自動變數] 和 [局部變數] 視窗會顯示相同的變數。 但是,您可以在 [局部變數] 視窗中修改這些變數的值,同時偵錯以查看它們對程序的影響。 在此案例中,我們會讓他們獨自離開。 選取 [局部變數] 視窗底部的 [自動變數],或從 [主功能表] 中選取 [偵錯][>][局部變數],以開啟 [>] 視窗。
oper 的值是 47 '/',結果為 0、x 為 10,而 y 為 0。
您也可以將滑鼠停留在程式碼中的變數上方,以查看其目前執行暫停時的值。 請先按下編輯器視窗,以確定編輯器視窗處於焦點中。
繼續偵錯
左邊的黃色箭號會顯示目前的執行點。 目前的行會呼叫
Calculate
,因此請按 F11 鍵以 單步執行 函式。 現在,您正在函式主體Calculate
中執行程序代碼。 請小心使用 執行進入, 因為它會進入您所在行的任何函式,包括標準庫函式。 您可以進入標準程式庫,但相較於程式庫的程式碼,您可能更有興趣專注於您自己的程式碼。現在執行點是在函式的
Calculate
開頭,請按 F10 移至程式執行中的下一行。 F10 也稱為 「步過」。 您可以使用 [逐步執行 ] 從行移至行,而不深入探討該行中每個部分所發生之專案的詳細數據。 一般而言,您應該使用 「略過」,而不是 「單步進入」,除非您想要更深入地查看從其他地方呼叫的程式代碼(就像您要查看Calculate
的主體一樣)。繼續使用 F10 來 逐步執行 每一行,直到返回到另一個檔案的
main()
函式,並在cout
行停止。程式正在執行預期的工作:它會採用第一個數位,並將它除以第二個數位。 在
cout
行上,將滑鼠停留在result
變數上,或在 [result
] 視窗中查看。 其值為inf
,看起來不對。調試程式中目前的語句是 cout << “Result is: ” << result << endl;在 [自動變數] 視窗中,結果為 inf。
讓我們修正此問題。 此
cout
行會輸出儲存在 中result
的任何值,因此當您使用 F10 再向前執行一行時,控制台視窗會顯示:應用程式輸出:請輸入要執行的作業。 格式:a+b |a-b |a*b |a/b. 用戶輸入了 5-0。 應用程式輸出:結果為:5。 用戶輸入 10/0。 應用程式輸出:結果為:inf
此結果是因為除以零是未定義的,所以程式無法提供所要求操作的計算結果。
修正「除以零」錯誤
讓我們更優雅地處理除以零的情況,讓使用者更容易了解問題。
在
CalculatorTutorial.cpp
中進行下列變更。 您可以讓程式在編輯時繼續執行,這要歸功於名為 [編輯後繼續] 的調試程式功能。 新增一個if
語句於cin >> x >> oper >> y;
之後,以檢查是否除以零並在發生時向使用者輸出訊息。 否則,會列印結果。// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include <iostream> #include "Calculator.h" using namespace std; int main() { double x = 0.0; double y = 0.0; double result = 0.0; char oper = '+'; cout << "Calculator Console Application" << endl << endl; cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b" << endl; Calculator c; while (true) { cin >> x >> oper >> y; if (oper == '/' && y == 0) { cout << "Math error: Attempted to divide by zero!" << endl; continue; } else { result = c.Calculate(x, oper, y); } cout << "Result " << "of " << x << oper << y << " is: " << result << endl; } return 0; }
按 F5 一次。 程序執行會繼續執行,直到它必須暫停才能要求使用者輸入。 再次輸入
10 / 0
。 現在會列印更實用的訊息。 系統會要求使用者輸入更多,且程式會繼續正常執行。控制台視窗會顯示兩行:10 / 0 結果為:inf,後面接著 10 / 0 數學錯誤:嘗試除以零。
備註
當您在偵錯模式中編輯程式代碼時,程式代碼變得過時的風險。 當調試程式仍在執行舊程序代碼,但尚未使用您的變更進行更新時,就會發生這種情況。 調試程式會顯示對話方塊,以通知您何時發生這種情況。 有時候,您可能需要按 F5 來重新整理正在執行的程式代碼。 特別是,如果您在函式內進行變更,而執行點仍位於該函式內,則需要跳出函式,然後再進入該函式,以取得更新的程式碼。 如果這無法運作,而且您看到錯誤訊息,您可以單擊 IDE 頂端功能表選單的紅色方塊來停止偵錯,然後輸入 F5 或選擇工具列上停止按鈕旁的綠色「播放」箭號,再次開始偵錯。
編輯後繼續可能會失敗的另一個原因是,如果您看到一則訊息,指出「需要原始程序檔完全符合偵錯->選項->一般]底下的原始版本設定,則必須啟用...」。若要修正此問題,請從主功能表中選取 [>>>偵錯一般],並確定已核取 [要求原始程序檔完全符合原始版本]。
了解執行和偵錯快捷方式
- F5,或偵錯>開始偵錯,如果尚未有偵錯會話,則會啟動一個偵錯會話,並執行程式直到碰到斷點或需要使用者輸入為止。 如果不需要任何使用者輸入,而且沒有可叫用斷點,程式就會終止,而控制台視窗會在程式完成執行時自行關閉。 如果您的程序輸出到主控台,請在按下 F5 以保持窗口開啟之前,先使用 Ctrl+F5 或設定斷點。
- Ctrl+F5或>[開始但不進入偵錯模式] 會執行應用程式,而不進入偵錯模式。 這比偵錯快一點,而且程式完成執行之後,控制台視窗會保持開啟狀態。
- 稱為「逐步執行」的 F10 可讓您逐行逐行逐一查看程式代碼,並可視化程式代碼的執行方式,以及每個執行步驟中的變數值。
- F11 稱為 「逐步執行」的運作方式與 「逐步執行」類似,但會逐步執行任何呼叫的函式。 例如,如果執行中的行呼叫函式,按 F11 會將指標移至函式主體,因此您可以遵循函式的程式代碼執行,再回到您開始的行。 在函數調用上按 F10 步驟,並直接移至下一行;函式呼叫仍會發生,但程式不會暫停以顯示其運作方式。
關閉應用程式
- 如果仍在執行中,請關閉主控台視窗以停止計算機應用程式。
新增 Git 原始檔控制
既然您已建立應用程式,您可能想要將其新增至 Git 存放庫。 我們會助您一臂之力。 Visual Studio 提供可直接在 IDE 中使用的 Git 工具,使這一過程變得簡單。
小提示
Git 是最常使用的新式版本控制系統,因此無論您是專業開發人員,還是您正在學習如何撰寫程式代碼,Git 都非常有用。 如果您不熟悉 Git,https://git-scm.com/ 網站是很好的起點。 您可以在該處找到速查表、熱門的在線書籍和 Git 基本概念影片。
若要將程式代碼與 Git 產生關聯,您一開始會建立程式代碼所在的新 Git 存放庫。 方法如下:
在 Visual Studio 右下角的狀態欄中,選取 [新增至原始檔控制],然後選取 [Git]。
在 [ 建立 Git 存放庫] 對話框中,登入 GitHub。
存放庫名稱會根據您的資料夾位置自動填入。 根據預設,您的新存放庫是私人的,這表示您是唯一可以存取它的人員。
小提示
無論您的存放庫是公用還是私人,最好有安全地儲存在 GitHub 上的程式代碼遠端備份。 即使您未與小組合作,遠端存放庫仍可讓您從任何電腦使用您的程式代碼。
選擇 創建並推送。
建立存放庫之後,狀態詳細數據會出現在狀態欄中。
第一個具有箭號的圖示會顯示您最新分支中的傳出/傳入認可數目。 您可以使用此圖示來拉取任何傳入提交或推送任何傳出提交。 您也可以選擇先檢視這些提交。 若要這樣做,請選取圖示,然後選取 [ 檢視傳出/傳入]。
第二個具有鉛筆的圖示會顯示程式代碼未認可的變更數目。 您可以選取此圖示,在 [Git 變更] 視窗中檢視這些變更。
若要深入瞭解如何搭配您的應用程式使用 Git,請參閱 Visual Studio 版本控制檔。
完成的應用程式
祝賀! 您已完成計算機應用程式的程式代碼、建置並對其進行偵錯,並將它新增至存放庫,全部都在Visual Studio中。
後續步驟
C++程序設計人員的一般起點是命令行上執行的 “Hello, world!” 應用程式。 您從本文開始,然後移至更具挑戰性的內容:計算機應用程式。
先決條件
- 您的電腦上需要安裝並運行 Visual Studio,並包含 使用 C++ 的桌面開發 工作負載。 若要安裝,請參閱 在 Visual Studio 中安裝C++支援。
建立您的應用程式專案
Visual Studio 會使用 專案 來組織應用程式的程式代碼,以及組織一或多個項目 的解決方案 。 專案包含用來建置應用程式的所有選項、組態和規則。 它也會管理所有項目檔案與任何外部檔案之間的關聯性。 若要建立您的應用程式,請先建立新的專案和方案。
在 Visual Studio 的功能表欄上,選取 [ 檔案>新>專案]。 [ 新增專案] 視窗隨即開啟。
在左側提要欄位中,確定已選取 Visual C++ 。 在中央,選取 [主控台應用程式]。
在底部的 [ 名稱 ] 文本框中,將新專案命名為 CalculatorTutorial,然後選取 [ 確定]。
在左側選取 [其他語言] > [Visual C++]。 在中央,選取 [主控台應用程式] 項目類型。 名稱文本框包含 CalculatorTutorial。
已建立空的 C++ Windows 控制台應用程式 "Hello World"。 主控台應用程式會使用 Windows 主控台視窗來顯示輸出並接受使用者輸入。 在 Visual Studio 中,編輯器視窗隨即開啟,並顯示產生的程式代碼:
// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include <iostream> int main() { std::cout << "Hello World!\n"; } // Run program: Ctrl + F5 or Debug > Start Without Debugging menu // Debug program: F5 or Debug > Start Debugging menu // Tips for Getting Started: // 1. Use the Solution Explorer window to add/manage files // 2. Use the Team Explorer window to connect to source control // 3. Use the Output window to see build output and other messages // 4. Use the Error List window to view errors // 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project // 6. In the future, to open this project again, go to File > Open > Project and select the .sln file
確認新的應用程式建置並執行
新 Windows 控制台應用程式的範本會建立簡單的C++ “Hello World” 應用程式。 此時,您可以看到 Visual Studio 如何建置和執行您直接從 IDE 建立的應用程式。
若要建置專案,請從 [建置] 功能表中選取 [建置方案]。 [輸出] 視窗會顯示建置程序的結果。
若要執行程式代碼,請在功能表欄上選取偵錯、[啟動但不偵錯](Ctrl+F5)。
主控台視窗隨即開啟,您的應用程式會在其中執行。
當您在 Visual Studio 中啟動控制台應用程式時,它會執行您的程式代碼,然後列印
Press any key to close this window . . .
以讓您有機會查看輸出。祝賀! 您已在 Visual Studio 中建立第一個 “Hello, world!” 控制台應用程式!
按下按鍵以關閉主控台視窗並返回Visual Studio。
您現在有工具可在每次變更之後建置並執行您的應用程式,以確認程式代碼仍如預期般運作。 稍後,我們會示範如何偵錯它,如果它無法運作。
編輯程序代碼
現在,讓我們將此範本中的程式代碼變成計算機應用程式。
將檔案的內容
CalculatorTutorial.cpp
取代為下列程序代碼,使其符合此範例:// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include <iostream> using namespace std; int main() { cout << "Calculator Console Application" << endl << endl; cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b" << endl; return 0; } // Run program: Ctrl + F5 or Debug > Start Without Debugging menu // Debug program: F5 or Debug > Start Debugging menu // Tips for Getting Started: // 1. Use the Solution Explorer window to add/manage files // 2. Use the Team Explorer window to connect to source control // 3. Use the Output window to see build output and other messages // 4. Use the Error List window to view errors // 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project // 6. In the future, to open this project again, go to File > Open > Project and select the .sln file
瞭解程式代碼:
-
#include
語句會將其他檔案中的程式代碼引入。 有時候,您可能會看到以角括弧括住的檔名,例如<iostream>
。 角括弧會指示編譯程式先在標準系統目錄中尋找iostream
標頭檔,如果找不到,則尋找專案特定的目錄。 其他時候,您可能會看到檔名周圍有引號,例如"someHeader.h"
。 引號會指示編譯程式略過在標準系統目錄中尋找,而只會查看專案特定的目錄。 -
using namespace std;
會指示編譯程式預期C++標準連結庫的程式代碼會用於這個檔案中。 如果沒有這一行,連結庫中的每個關鍵詞必須前面加上std::
,才能表示其範圍。 例如,如果沒有該行,每個對cout
的參考都會寫成std::cout
。 新增了using
語句,以便更方便存取另一個命名空間中的程式碼。 -
cout
關鍵詞會在 C++ 中列印至標準輸出。 運算子<<
會指示編譯程式將其右側的任何內容傳送至標準輸出。 - 關鍵詞
endl
就像 Enter 鍵;它會結束這一行,並將游標移至下一行。 最好是將 放在\n
字串內(包含""
)以執行相同動作,因為endl
一律會排清緩衝區,而且可能會損害程式的效能。 由於這是一個非常小的應用程式,因此改用endl
來替代。 - 所有C++語句都必須以分號結尾,而且所有C++應用程式都必須包含函
main()
式。 此函式是程式在啟動時執行的內容。 所有程式代碼都必須可從main()
存取,才能使用。
-
若要儲存盤案,請按 Ctrl+S,或選取功能表欄下方工具列中的磁碟片圖示。
若要執行應用程式,請按 Ctrl+F5 或移至 [ 偵 錯] 功能表,然後選取 [ 啟動但不偵錯]。 如果您收到顯示 此專案已過期的彈出視窗,您可以選取 [不要再顯示此對話框],然後選取 [ 是 ] 來建置您的應用程式。 您應該看到看起來如下的主控台視窗:
主控台應用程式會顯示輸出,也就是:計算機主控台應用程式。 請輸入要執行的作業。 格式:a+b |a-b |a*b |a/b. 程式以程式代碼 0 結束,而且有訊息會在偵錯停止時自動關閉主控台,請啟用 [工具] > [選項] >偵錯>在偵錯停止時自動關閉控制台。 最後,有訊息可按下任何按鍵關閉此視窗。
當您完成時,請關閉主控台視窗。
新增程式代碼以執行一些數學運算
類別就像是物件執行某些動作的藍圖。 在此情況下,我們會定義計算機類別來包含數學邏輯。
新增 Calculator 類別
移至 [專案] 功能表,然後選取 [ 新增類別]。 在 [ 類別名稱] 編輯方塊中,輸入 計算機。 請選擇 [確定]。
類別名稱欄位包含文字計算機。 .h 檔案欄位包含 Calculator.h。 .cpp檔案欄位包含Calculator.cpp。 基類欄位是空的。 內嵌和Managed的選項未被勾選。
類別就像是物件執行某些動作的藍圖。 在此情況下,我們會定義計算機及其運作方式。
兩個新檔案會新增至您的專案。 若要一次儲存所有已變更的檔案,請按 Ctrl+Shift+S。 這是 [全部儲存盤>] 的鍵盤快捷方式。 另外還有 [ 全部儲存] 工具列按鈕,這是兩個磁碟片的圖示,位於 [儲存 ] 按鈕旁邊 。 一般而言,最好經常執行 [全部儲存 ],因此當您儲存時不會錯過任何檔案。
[新增類別精靈] 會
.h
建立 與 類別同名的檔案.cpp
。 您可以在 [ 方案 總管] 視窗中看到項目檔的完整清單,顯示在 IDE 側邊。 如果看不到 方案 總管,請從功能表欄開啟它:選取 [ 檢視>方案總管]。計算機教學課程專案具有頭文件節點,其中包含 Calculator.h、stdafx.h 和 targetver.h。 來源檔案節點包含Calculator.cpp、CalculatorTutorial.cpp和stdafx.cpp。 參考、外部相依性和資源文件的節點可看見,但已關閉。
您可以在 [方案總管] 視窗中按兩下滑鼠開啟檔案。 按兩下
Calculator.h
以開啟它。將 的內容
Calculator.h
取代為下列程式代碼,讓檔案現在看起來像這樣:#pragma once class Calculator { public: double Calculate(double x, char oper, double y); };
了解程式碼
- 此程式代碼會宣告名為
Calculate
的新函式,其會處理加法、減法、乘法和除法的數學運算。 - C++程式代碼會組織成 標頭 (
.h
) 檔案和 來源 (.cpp
) 檔案。 多種編譯器可支援其他副檔名,但這些是主要需要了解的。 函式和變數通常會 宣告,也就是在頭檔中指定名稱和類型,並在原始程式檔中 實作或指定定義。 若要存取另一個檔案中定義的程式代碼,您可以使用#include "filename.h"
,其中filename.h
是宣告您要使用的變數或函式的檔名。 - 最好根據程式代碼的功能將程式代碼組織成不同的檔案,以便您稍後輕鬆找到所需的程序代碼。 在我們的案例中,我們會將 類別與包含 函式的
Calculator
檔案分開定義main()
,但我們計劃參考Calculator
中的main()
類別。
- 此程式代碼會宣告名為
綠色波浪線會出現在
Calculate
,因為Calculate
函式雖然已宣告,但並未定義。 將滑鼠停留在Calculate
上方,點擊燈泡上的向下箭號,然後選取 在Calculator.cpp
中建立 'Calculate' 的定義。 彈出視窗隨即出現,可讓您查看另一個檔案中所做的程式碼變更。 程式碼已新增至Calculator.cpp
。目前,它只會傳回 0.0。 讓我們改變這點。 按 Esc 關閉快顯,然後選擇 [ 是 ] 以儲存變更。
切換至
Calculator.cpp
編輯器視窗中的檔案。 以下列程式代碼取代檔案的內容:#include "Calculator.h" double Calculator::Calculate(double x, char oper, double y) { switch(oper) { case '+': return x + y; case '-': return x - y; case '*': return x * y; case '/': return x / y; default: return 0.0; } }
了解程式碼
- 函式
Calculate
接受數位、運算符和第二個數位。 然後,它會在兩個數字上執行要求的作業。 - 語句
switch
會檢查提供的運算子,並執行與該運算對應的情況。 此default:
情境是一個備用方案,用於當使用者輸入任何上述case
語句未處理的運算符時進行處理。 最好以更簡潔的方式處理無效的使用者輸入,但這已超出本教學課程的範圍。 - 關鍵詞
double
表示支援小數的數字類型。 這種類型的數位稱為浮點數,表示double
具有額外精確度的浮點數。 如此一來,計算機就可以處理十進位數學和整數數學。 函Calculate
式必須一律傳回雙精確度浮點數,因為程式代碼開頭的double
(這表示函式的傳回型別),這就是為什麼我們在預設案例中傳回0.0的原因。 - 檔案
.h
會宣告函式 原型,其會事先告知編譯程式需要哪些參數,以及預期其傳回類型。 檔案.cpp
具有函式的所有實作詳細數據。
- 函式
如果您此時再次建置並執行程序代碼,它仍會在要求執行哪個作業之後結束。 接下來,修改 函 main
式以執行一些計算。
呼叫 Calculator 類別成員函式
更新
main
函式中的CalculatorTutorial.cpp
,如下所示:// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include <iostream> #include "Calculator.h" using namespace std; int main() { double x = 0.0; double y = 0.0; double result = 0.0; char oper = '+'; cout << "Calculator Console Application" << endl << endl; cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b" << endl; Calculator c; while (true) { cin >> x >> oper >> y; result = c.Calculate(x, oper, y); cout << "Result is: " << result << endl; } return 0; }
了解程式碼
- 由於C++程式一律從
main()
函式開始,因此我們需要從該處呼叫其他程序代碼,因此需要語句#include
,才能讓函main()
式看到該程序代碼。 - 變數
x
、y
、oper
和result
會分別宣告為儲存第一個數位、第二個數位、運算元和最終結果。 最好給他們一些初始值,以避免未定義的行為,這就是這裡完成的工作。 - 此
Calculator c;
行會將名為c
的物件宣告為 類別的Calculator
實例。 類別本身只是計算機運作方式的藍圖;對象是執行數學運算的特定計算機。 - 語句
while (true)
是迴圈。 只要內部的條件()
為 true,迴圈內的程式代碼就會重複執行。 由於條件只是列為true
,因此一律為 true,因此循環會永遠執行。 若要關閉程式,用戶必須手動關閉控制台視窗。 否則,程式一律會等候新的輸入。 - 關鍵詞
cin
接受來自用戶的輸入。 輸入數據流足夠聰明,可以處理主控台視窗中輸入的一行文字,並依序放在列出的每個變數內。 - 表達式
c.Calculate(x, oper, y);
會呼叫Calculate
稍早定義的函式,並提供輸入值和要求的作業。 然後,函式會傳回儲存在 中的result
數位。 - 最後,
result
會列印到主控台,而使用者會看到計算的結果。
- 由於C++程式一律從
再次建置並測試程序代碼
再次測試程式,以確保一切正常運作。
按 Ctrl+F5 重建並啟動應用程式。
輸入
5+5
,然後按 Enter。 確認結果為 10。關閉主控台視窗以停止程式。
對應用程式進行偵錯
由於使用者可以在主控台視窗中輸入任何內容,因此讓我們確保程式可以處理非預期的輸入。 讓我們不要執行程式,而是進行偵錯,因此我們可以檢查其執行逐步執行的內容。
在調試程式中執行應用程式
在
CalcuatorTutorial.cpp
中,設定行上的result = c.Calculate(x, oper, y);
斷點。 若要設定斷點,請按兩下編輯器視窗左邊緣灰色垂直線旁的線條,讓紅點出現。現在當您對程序進行偵錯時,它一律會在該行暫停執行。 我們已經有一個粗略的想法,程式適用於簡單的案例。 由於我們不想每次暫停執行,因此讓我們設定斷點條件。
以滑鼠右鍵按兩下代表斷點的紅點,然後選取 [ 條件]。 在條件編輯方塊中, 輸入
(y == 0) && (oper == '/')
。 當您完成儲存斷點條件時,請選取 [ 關閉 ] 按鈕。斷點位於行上:result = c dot Calculate (x, oper, y)。 '條件...' [條件] 選項已勾選。 [條件] 下拉式清單會設定為 [條件運算式]。 條件下拉式清單會設定為 「Is true」。 條件設定為 y == 0 && oper == '/'。
如果嘗試除法 0,則執行會在斷點暫停。
若要偵錯程式,請按 F5,或選取具有綠色箭號圖示的 [ 本機 Windows 調試程式] 工具列按鈕。 在主控台應用程式中,如果您輸入類似 「5 - 0」 的內容,則程式會正常運作並持續執行。 不過,如果您輸入 「10 / 0」,它會在斷點暫停。 您甚至可以在運算符和數字之間放置任意數目的空格;
cin
足夠聰明,可以適當地剖析輸入。用戶輸入 5 - 0。 應用程式輸出:結果為 5。 然後,使用者輸入 10/0,由於符合條件斷點,執行會在以下行停止:result = c.Calculate(x,oper,y)。
調試程式中有用的視窗
當您對程式代碼進行偵錯時,您可能會注意到會出現一些新的視窗。 這些視窗可協助您的偵錯體驗。 查看 Autos 視窗。 [ 自動變數] 視窗會顯示目前至少使用三行的變數值,且最多是目前這一行。 如果您沒有看到 [自動變數] 視窗,請從主功能表選取 [偵>錯Windows>Autos]。
oper 的值是 47 '/',結果為 5、x 為 10,而 y 為 0。
若要查看該函式中的所有變數,請切換至 [ 局部變數 ] 視窗。 因為這是小型函式,[自動變數] 和 [局部變數] 視窗會顯示相同的變數。 但是您可以在偵錯時修改這些變數的值,以查看它們對程式有何影響。 在此案例中,我們會讓他們獨自離開。 選取 [局部變數] 視窗底部的 [自動變數],或從 [主功能表] 中選取 [偵錯][>][局部變數],以開啟 [>] 視窗。
oper 的值是 47 '/',結果為 0、x 為 10,而 y 為 0。
您也可以將滑鼠停留在程式碼本身的變數上方,以查看其目前暫停執行的值。 請先按下編輯器視窗,以確定編輯器視窗處於焦點中。
繼續偵錯
左邊的黃色箭號會顯示目前的執行點。 目前的行會呼叫
Calculate
,因此請按 F11 以 單步執行 函式,這會帶您進入函式的Calculate
主體。 請小心使用 執行進入, 因為它會進入您所在行的任何函式,包括標準庫函式。 您可以進入標準程式庫,但相較於程式庫的程式碼,您可能更有興趣專注於您自己的程式碼。現在執行點是在函式的
Calculate
開頭,請按 F10 移至程式執行中的下一行。 F10 也稱為 「步過」。 您可以使用 [逐步執行 ] 從行移至行,而不深入探討該行中每個部分所發生之專案的詳細數據。 一般而言,您應該使用 「略過步驟」,而不是 「進入步驟」,除非您想要更深入地探討從其他地方呼叫的程式碼(就像您先前進入過Calculate
的主體一樣)。繼續使用 F10 來 逐步執行 每一行,直到返回到另一個檔案的
main()
函式,並在cout
行停止。程式正在執行預期的工作:它會採用第一個數位,並將它除以第二個數位。 在
cout
行上,將滑鼠停留在result
變數上,或在 [result
] 視窗中查看。 其值為inf
,看起來不對。調試程式中目前的語句是 cout << “Result is: ” << result << endl;在 [自動變數] 視窗中,結果為 inf。
讓我們修正此問題。 此
cout
行會輸出儲存在 中result
的任何值,因此當您使用 F10 再向前執行一行時,控制台視窗會顯示:應用程式輸出:請輸入要執行的作業。 格式:a+b |a-b |a*b |a/b. 用戶輸入了 5-0。 應用程式輸出:結果為:5。 用戶輸入 10/0。 應用程式輸出:結果為:inf
此結果是因為除以零是未定義的,所以程式無法提供所要求操作的計算結果。
修正「除以零」錯誤
讓我們更優雅地處理除以零的情況,讓使用者更容易了解問題。
在
CalculatorTutorial.cpp
中進行下列變更。 (由於調試程式功能稱為 [編輯後繼續],因此您可以在編輯時讓程式繼續執行。 變更是新增if
下列cin >> x >> oper >> y;
語句,以檢查除法是否為零,並在發生時將訊息輸出給使用者。 否則,會列印結果:// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include <iostream> #include "Calculator.h" using namespace std; int main() { double x = 0.0; double y = 0.0; double result = 0.0; char oper = '+'; cout << "Calculator Console Application" << endl << endl; cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b" << endl; Calculator c; while (true) { cin >> x >> oper >> y; if (oper == '/' && y == 0) { cout << "Division by 0 exception" << endl; continue; } else { result = c.Calculate(x, oper, y); } cout << "Result is: " << result << endl; } return 0; }
按 F5 一次。 程序執行會繼續執行,直到它必須暫停才能要求使用者輸入。 再次輸入
10 / 0
。 現在會列印更實用的訊息。 系統會要求使用者輸入更多,且程式會繼續正常執行。備註
當您在偵錯模式中編輯程式代碼時,程式代碼變得過時的風險。 當調試程式仍在執行舊程序代碼,但尚未使用您的變更進行更新時,就會發生這種情況。 除錯器會彈出對話框,通知您何時發生這種情況。 有時候,您可能需要按 F5 來重新整理正在執行的程式代碼。 特別是,如果您在執行的位置位於該函數內時進行變更,請退出該函數,然後重新進入以取得更新的程式碼。 如果因為某些原因而無法運作,而且您看到錯誤訊息,您可以按下 IDE 頂端功能表下工具列中的紅色方塊來停止偵錯,然後輸入 F5 或選擇工具列上停止按鈕旁的綠色「播放」箭號,再次開始偵錯。
編輯後繼續可能會失敗的另一個原因是您必須移至主功能表,然後選取 [工具>選項>>偵錯一般],並確定已核取 [要求原始程序檔完全符合原始版本]。
了解執行和偵錯快捷方式
- F5,或偵錯>開始偵錯,如果尚未有偵錯會話,則會啟動一個偵錯會話,並執行程式直到碰到斷點或需要使用者輸入為止。 如果不需要任何使用者輸入,而且沒有可叫用斷點,程式就會終止,而控制台視窗會在程式完成執行時自行關閉。 如果您的程序輸出到主控台,請在按下 F5 以保持窗口開啟之前,先使用 Ctrl+F5 或設定斷點。
- Ctrl+F5或>[開始但不進入偵錯模式] 會執行應用程式,而不進入偵錯模式。 這比偵錯快一點,而且程式完成執行之後,控制台視窗會保持開啟狀態。
- 稱為「逐步執行」的 F10 可讓您逐行逐行逐一查看程式代碼,並可視化程式代碼的執行方式,以及每個執行步驟中的變數值。
- F11 稱為 「逐步執行」的運作方式與 「逐步執行」類似,但會逐步執行任何呼叫的函式。 例如,如果執行中的行呼叫函式,按 F11 會將指標移至函式主體,因此您可以遵循函式的程式代碼執行,再回到您開始的行。 在函數調用上按 F10 步驟,並直接移至下一行;函式呼叫仍會發生,但程式不會暫停以顯示其運作方式。
關閉應用程式
- 如果仍在執行中,請關閉主控台視窗以停止計算機應用程式。
完成的應用程式
祝賀! 您已完成計算機應用程式的程式代碼,並在 Visual Studio 中建置並對其進行偵錯。