C++ 程式設計/示例/Hello world
下面是一個簡單的 C++ 程式示例
// 'Hello World!' program
#include <iostream>
int main()
{
std::cout << "Hello World!" << std::endl;
return 0;
}
編寫程式時,您需要使用開發環境。您的開發環境可以是基本的文字編輯器,也可以是功能豐富的 C++ 整合開發環境 (IDE)。您不應使用文字處理軟體(如 Microsoft Word),因為它們會向文字新增格式化程式碼。
如果您還沒有可用的編譯器,請參閱本書的從哪裡獲取編譯器部分。
開啟您的開發環境,輸入顯示的程式(或複製並貼上),並將其儲存為hello.cc。
現在使用 C++ 編譯器編譯它
COMMAND_PROMPT> g++ hello.cc -o hello
此示例使用 GCC,即 GNU 編譯器集合(http://gcc.gnu.org),但您可以使用任何其他編譯器,或使用 IDE 進行編譯。上述命令將生成一個名為hello或hello.exe的可執行檔案。呼叫可執行檔案以執行您的第一個 C++ 程式
Unix
COMMAND_PROMPT> ./hello Hello World! COMMAND_PROMPT>
Microsoft Windows
COMMAND_PROMPT> dear hello Hello World! COMMAND_PROMPT>
斜體文字由您鍵入,而粗體文字由程式輸出。如果您使用IDE,它可能會根據語法自動為您著色程式碼。
- g++
- 未找到命令
您沒有安裝 GNU C++ 編譯器。如果您有其他編譯器,請檢視其文件以獲取正確的編譯命令。
- 編譯器命令錯誤
許多奇怪的錯誤,多次提及
undefined reference to `std::basic_ostream' [..]
通常以以下結尾
collect2: ld returned 1 exit status
要使用g++編譯您的 hello.cc,請使用
g++ hello.cc -o hello
對於gcc,使用
gcc hello.cc -o hello -lstdc++
- hello
- 未找到命令
您沒有鍵入完整路徑,請嘗試
./hello
是否有hello此目錄中的程式?當您鍵入時,您能看到它嗎?ls?如果不是,則您的編譯(g++ hello.cc -o hello)失敗或您已切換到錯誤的目錄。
如果您未指定-o hello, g++命名輸出檔案a.out(彙編程式輸出),出於歷史原因。在這種情況下,請鍵入
./a.out
以執行程式。
C++ 的一些特性是語言的一部分,而另一些特性則是標準庫的一部分。標準庫是一組程式碼,每個符合標準的 C++ 編譯器都提供該程式碼。當 C++ 編譯器編譯您的程式時,它通常還會將其與標準 C++ 庫連結。
當您使用庫中的特性時,C++ 要求您宣告將要使用的特性。程式中的第一行是預處理指令。在我們的示例中,它顯示為粗體和斜體
- IOStreams 的預處理指令
#include <iostream>
此行導致 C++ 宣告(位於iostream 標頭檔案中)被包含在您的程式中以供使用。通常,編譯器會將名為iostream的標頭檔案的內容插入到程式中。它放在哪裡取決於系統。此類檔案的位置可能在編譯器的文件中進行描述。標準標頭檔案參考表中列出了標準 C++ 標頭檔案。
該iostream標頭檔案包含用於輸入/輸出 (I/O) 的各種宣告。它使用稱為流的 I/O 機制的抽象。例如,有一個名為std::cout的輸出流物件,用於將文字輸出到標準輸出。通常,這會將文字顯示在計算機螢幕上。
預處理器是編譯器的一部分,它在實際編譯器看到程式碼之前對程式碼進行一些轉換。例如,在遇到#include <iostream>指令時,它會將指令替換為iostream標頭檔案的內容。
int main()
{
// ...
}
以上幾行表示一段 C++ 程式碼塊,命名為main。在 C++ 中,這樣的命名程式碼塊稱為函式。塊的內容稱為函式的主體。
單詞int顯示為粗體,因為它是一個關鍵字。C++ 關鍵字具有一些特殊含義,並且也是保留字,即不能用於除其預期用途之外的任何目的。另一方面main不是關鍵字,您可以在許多關鍵字無法使用的地方使用它(儘管不建議這樣做,因為可能會導致混淆)。
每個(符合標準的)C++ 程式都必須定義一個名為main的函式。程式的執行從這裡開始。正如我們稍後將看到的,main可以呼叫其他函式,這些函式又可以呼叫其他函式。編譯器安排在程式開始執行時呼叫main函式。(雖然這通常是正確的,但並非總是如此。對於在最開始就執行main,有一個例外,我們將在稍後看到。)
現在讓我們看一下main函式內部的程式碼。
中的第一行main使用std::cout物件列印字串(字元序列)Hello World!並結束行
std::cout << "Hello World!\n";
此行是C++ 語句。C++ 語句以分號 (;) 結尾。在語句<<中,稱為插入運算子的運算子用於使用std::cout流輸出字串。C++ 字串用雙引號 (") 括起來。引號本身不是字串的一部分,因此不會列印。序列\n用於字串中表示當前行的結尾。儘管該序列由兩個字元表示,但它僅佔用一個字元的記憶體空間。因此,序列\n稱為換行符。換行的實際過程取決於系統,但 C++ 標準庫會為您處理,而無需您瞭解。
以下是同一程式,但進行了細微修改
// This program just displays a string and exits
#include <iostream>
int main()
{
std::cout << "Hello World!";
std::cout << std::endl;
return 0;
}
開頭新增的行
// This program just displays a string and exits
是一條試圖解釋程式碼作用的註釋。註釋對於任何非簡單的程式來說都是必不可少的,這樣閱讀程式碼的人就能理解它預期要做什麼。註釋分隔符之間包含的內容沒有限制。編譯器只是忽略註釋中所有存在的內容。在我們的示例中,註釋以斜體顯示。C++ 支援兩種形式的註釋。
- 單行註釋以//開頭,並延伸到行尾。這些也可以用於語句的右側來解釋該語句的作用。
- 多行註釋以/*序列開頭,並以*/序列結尾。這些可用於跨越多行的註釋。這些也被稱為 C 樣式註釋,因為這最初是 C 中唯一可用的註釋型別。例如:
/* This program displays a string and then it exits */
註釋有時也用於包含我們暫時希望編譯器忽略但打算以後使用的程式碼。這在**除錯**(查詢程式中的**錯誤**或錯誤的過程)中非常有用。如果程式沒有給出預期的結果,透過“註釋掉”程式碼,就可以追蹤哪個特定的語句存在錯誤。由於 C 樣式註釋可以在行尾之前停止,因此可以用來“註釋掉”程式中一行內的程式碼小部分。
每當你寫入(即傳送任何輸出)到輸出流時,它不會立即被寫入。它首先儲存在記憶體中,實際上可能在將來的任何時間寫入。此過程稱為緩衝,用於儲存此類臨時資料的記憶體區域稱為緩衝區。有時需要重新整理輸出流緩衝區以確保所有資料都已寫入。這是透過將插入運算子應用於輸出流和物件std::endl來實現的。這就是該行所做的操作
std::cout << std::endl;
在重新整理緩衝區之前,std:endl還會寫入一個換行符(這解釋了它的名稱,end line)。因此,在上一行列印的字串中省略了換行符。
在大多數作業系統中,每個程式都允許使用一個稱為退出狀態的值與其呼叫者通訊,以指示它是否成功完成執行。按照慣例,退出狀態為 0 表示成功,任何其他值都表示失敗。退出狀態的不同值可用於指示不同型別的失敗。在我們的簡單程式中,我們希望以狀態 0 退出。
C++ 允許main函式返回一個整數值,該值將作為程式的退出狀態傳遞給作業系統。語句
return 0;
使main返回 0 值。由於main函式需要返回一個整數,因此關鍵字int用於開始函式定義。此語句是可選的,因為編譯器會自動生成程式碼以在控制掉落而沒有main函式返回 0。這就是第一個程式無需任何 return 語句即可工作的原因。請注意,這只是一個僅適用於return語句的情況下為main函式的特殊情況。對於其他函式,如果它們宣告為返回任何內容,則必須返回一個值。
常見程式設計錯誤 1 雖然return語句是可選的,main不應宣告為返回void(宣告為void的函式是不返回任何內容的函式),如 Java 等其他一些語言中那樣。一些 C++ 編譯器可能不會對此抱怨,但這是不正確的。這樣做可能等同於返回碰巧儲存在特定記憶體位置或暫存器中的任何隨機數字,具體取決於平臺。此做法也可能對某些作業系統造成潛在損害,這些作業系統依賴於返回程式碼來確定如何處理崩潰或其他異常退出。
空格、製表符和換行符(換行符)通常稱為空白。除了預處理指令和 C++ 樣式註釋在換行符處結束的規則外,這些都被編譯器忽略,除非在引號內。因此,上面的程式也可以這樣編寫
// This program just displays a string and exits, variation 1
#include <iostream>
int main() { std::cout<<"Hello World!"; std::cout<<std::endl; return 0; }
但是,請注意,需要空格來分隔相鄰的單詞和數字。為了使程式更易讀,必須適當地使用空白。
使用空白來提高程式碼可讀性時遵循的約定構成了縮排樣式。例如,使用備選縮排樣式,程式可以這樣編寫
// This program just displays a string and exits, variation 2
#include <iostream>
int main() {
std::cout << "Hello World!";
std::cout << std::endl;
return 0;
}
或這樣
// This program just displays a string and exits
#include <iostream>
int main()
{
std::cout << "Hello World!";
std::cout << std::endl;
return 0;
}