學習編程語言的最好方法是編寫程序。通常,初學者編寫的第一個程序是一個名為“Hello World”的程序,它只是將“Hello World”打印到您的計算機屏幕上。盡管它非常簡單,但它包含了 C++ 程序具有的所有基本組件:
// my first program in C++
#include
int main()
{
std::cout << "Hello World!";
}
上面顯示了該程序的 C++ 代碼。
Hello World!
上面顯示了程序由計算機執行時的結果。面板左側的灰色數字是行號,使討論程序和研究錯誤更容易。他們不是該程序的一部分。
讓我們一行一行地檢查這個程序:
第 1 行: ??// my first program in C++?
?兩個斜杠表示該行的其余部分是程序員插入的注釋,但對程序的行為沒有影響。程序員使用它們來包括關于代碼或程序的簡短解釋或觀察。在這種情況下,它是程序的簡要介紹性描述。
第 2 行: ??#include
??以井號 ( ??#?
?)開頭的行是由所謂的預處理器讀取和解釋的指令。它們是在程序本身開始編譯之前解釋的特殊行。在這種情況下,指令??#include
?指示預處理器包含一段標準 C++ 代碼,稱為標頭 iostream,它允許執行標準輸入和輸出操作,例如寫入該程序的輸出(你好,世界) 到屏幕。
第 3 行:空行。空行對程序沒有影響。它們只是提高了代碼的可讀性。
第 4 行: ??int main ()?
??這一行啟動了一個函數的聲明。本質上,一個函數是一組被賦予名稱的代碼語句:在這種情況下,這將名稱賦予后面的代碼語句組“main”。函數將在后面的章節中詳細討論,但本質上,它們的定義是通過一系列類型 ( ??int?
??)、名稱 ( ??main?
??) 和一對括號 ( ??()?
?)引入的,可選地包括參數。
命名??main?
??的函數是所有 C++ 程序中的一個特殊函數;它是程序運行時調用的函數。所有 C++ 程序的執行都從??main?
?函數開始,而不管函數在代碼中的實際位置。
第 5 行和第 7 行:??{?
??和??}?
??第??{?
??5 行的左大括號 ( ) 表示??main?
??函數定義的開始,第??}?
??7 行的右大括號 ( ) 表示其結束。這些大括號之間的一切都是函數體,它定義了??main?
?調用時會發生什么。所有函數都使用大括號來表示其定義的開始和結束。
第 6 行: ??std::cout << "Hello World!";?
?這一行是一個 C++ 語句。語句是一種可以實際產生某種效果的表達式。它是程序的核心,指定其實際行為。語句的執行順序與它們出現在函數體內的順序相同。
該語句有三個部分:一是??std::cout?
?,它標識標準輸出設備(通常,這是計算機屏幕)。其次,插入運算符 ( ??<
??),表示后面的內容被插入到 中??std::cout?
?。最后,引號內的句子(“Hello world!”)是插入到標準輸出中的內容。
請注意,該語句以分號 (??;?
?)。這個字符標志著語句的結束,就像句號結束句子一樣。所有 C++ 語句都必須以分號字符結尾。C++ 中最常見的語法錯誤之一是忘記以分號結束語句。
您可能已經注意到,在執行代碼時,并非該程序的所有行都執行操作。有一行包含注釋(以 開頭??//?
??)。有一行帶有預處理器的指令(以 開頭??#?
??)。有一行定義了一個函數(在本例中為??main?
??函數)。最后,一行包含以分號結尾的語句(插入到??cout?
??),它位于由函數的大括號 ( ??{ }?
??)分隔的塊內??main?
?。
該程序已按不同的行構建并適當縮進,以便閱讀它的人更容易理解。但是 C++ 對縮進或如何在不同行中拆分指令沒有嚴格的規則。例如,代替
int main ()
{
std::cout << " Hello World!";
}
我們可以這樣寫:
int main () { std::cout << "Hello World!"; }
全部在一行中,這與前面的代碼具有完全相同的含義。
在 C++ 中,語句之間的分隔是用結束分號 ( ??;?
?)指定的,因此分隔成不同的行根本無關緊要。許多語句可以寫在一行中,或者每個語句都可以多帶帶一行。代碼在不同行中的劃分只是為了讓可能閱讀它的人更易讀和更具示意圖,但對程序的實際行為沒有影響。
現在,讓我們在我們的第一個程序中添加一條額外的語句:
// my second program in C++
#include
int main ()
{
std::cout << "Hello World! ";
std::cout << "Im a C++ program";
}
在這種情況下,程序??std::cout?
??在兩個不同的語句中執行了兩次插入。再一次,不同代碼行的分離只是為程序提供了更大的可讀性,因為??main?
?以這種方式定義完全有效:
int main () { std::cout << " Hello World! "; std::cout << " Im a C++ program "; }
源代碼也可以分成更多的代碼行:
int main ()
{
std::cout <<
"Hello World!";
std::cout
<< "Im a C++ program";
}
結果將再次與前面的示例完全相同。
預處理器指令(那些以 開頭的指令??#?
??)不屬于這個一般規則,因為它們不是語句。它們是在正確編譯開始之前由預處理器讀取和處理的行。預處理器指令必須在它們自己的行中指定,并且因為它們不是語句,所以不必以分號 ( ??;?
?)結尾。
注釋
如上所述,注釋不影響程序的運行;然而,它們提供了一個重要的工具,可以直接在源代碼中記錄程序的功能和運行方式。
C++ 支持兩種注釋代碼的方式:
// line comment
/* block comment */
第一個,稱為行注釋,丟棄從找到斜杠 ( ??//?
?) 到同一行末尾的所有內容。第二個,稱為塊注釋,丟棄??/*?
??字符和字符第一次出現之間的所有內容??*/?
?,可能包含多行。
讓我們為第二個程序添加注釋:
/* my second program in C++
with more comments */
#include
int main ()
{
std::cout << "Hello World! "; // prints Hello World!
std::cout << "Im a C++ program"; // prints Im a C++ program
}
如果在程序的源代碼中包含注釋而不使用注釋字符組合??//?
??,??/*?
??或??*/?
?,編譯器會將它們視為 C++ 表達式,很可能會導致編譯失敗并顯示一個或多個錯誤消息。
使用命名空間 std
如果您之前看過 C++ 代碼,您可能已經看到??cout?
??使用??std::cout?
?. 兩者都命名同一個對象:第一個使用它的非限定名稱( ??cout?
?),而第二個直接在命名空間 內限定它??std?
??(as ??std::cout?
?)。
??cout?
?是標準庫的一部分,標準 C++ 庫中的所有元素都在所謂的命名空間中聲明:命名空間??std?
?。
為了參考元素的??std?
??命名空間的程序應由有資格的每一個使用該庫的元素(如,我們通過做前綴??cout?
??與??std::?
?),或引入其組件的可見性。引入這些組件可見性的最典型方法是使用聲明:
using namespace std;
上述聲明允許??std?
?以非限定方式(不帶??std::?
?前綴)訪問命名空間中的所有元素。
考慮到這一點,可以重寫最后一個示例以對??cout?
?進行不合格的使用:
// my second program in C++
#include
using namespace std;
int main ()
{
cout << "Hello World! ";
cout << "Im a C++ program";
}
訪問??std?
?命名空間元素的兩種方式(顯式限定和使用聲明)在 C++ 中都是有效的,并且產生完全相同的行為。為簡單起見并提高可讀性,這些教程中的示例將更頻繁地使用后一種方法和using聲明,但請注意,顯式限定是保證永遠不會發生名稱沖突的唯一方法。
命名空間在后面的章節中有更詳細的解釋。