學(xué)習(xí)編程語(yǔ)言的最好方法是編寫(xiě)程序。通常,初學(xué)者編寫(xiě)的第一個(gè)程序是一個(gè)名為“Hello World”的程序,它只是將“Hello World”打印到您的計(jì)算機(jī)屏幕上。盡管它非常簡(jiǎn)單,但它包含了 C++ 程序具有的所有基本組件:

// my first program in C++
#include

int main()
{
std::cout << "Hello World!";
}

上面顯示了該程序的 C++ 代碼。


Hello World!


上面顯示了程序由計(jì)算機(jī)執(zhí)行時(shí)的結(jié)果。面板左側(cè)的灰色數(shù)字是行號(hào),使討論程序和研究錯(cuò)誤更容易。他們不是該程序的一部分。


讓我們一行一行地檢查這個(gè)程序:


第 1 行: ??// my first program in C++??兩個(gè)斜杠表示該行的其余部分是程序員插入的注釋,但對(duì)程序的行為沒(méi)有影響。程序員使用它們來(lái)包括關(guān)于代碼或程序的簡(jiǎn)短解釋或觀察。在這種情況下,它是程序的簡(jiǎn)要介紹性描述。


第 2 行: ??#include ???以井號(hào) ( ??#??)開(kāi)頭的行是由所謂的預(yù)處理器讀取和解釋的指令。它們是在程序本身開(kāi)始編譯之前解釋的特殊行。在這種情況下,指令??#include ??指示預(yù)處理器包含一段標(biāo)準(zhǔn) C++ 代碼,稱為標(biāo)頭 iostream,它允許執(zhí)行標(biāo)準(zhǔn)輸入和輸出操作,例如寫(xiě)入該程序的輸出(你好,世界) 到屏幕。


第 3 行:空行。空行對(duì)程序沒(méi)有影響。它們只是提高了代碼的可讀性。

第 4 行: ??int main ()???這一行啟動(dòng)了一個(gè)函數(shù)的聲明。本質(zhì)上,一個(gè)函數(shù)是一組被賦予名稱的代碼語(yǔ)句:在這種情況下,這將名稱賦予后面的代碼語(yǔ)句組“main”。函數(shù)將在后面的章節(jié)中詳細(xì)討論,但本質(zhì)上,它們的定義是通過(guò)一系列類型 ( ??int???)、名稱 ( ??main???) 和一對(duì)括號(hào) ( ??()??)引入的,可選地包括參數(shù)。


命名??main???的函數(shù)是所有 C++ 程序中的一個(gè)特殊函數(shù);它是程序運(yùn)行時(shí)調(diào)用的函數(shù)。所有 C++ 程序的執(zhí)行都從??main??函數(shù)開(kāi)始,而不管函數(shù)在代碼中的實(shí)際位置。

第 5 行和第 7 行:??{???和??}???第??{???5 行的左大括號(hào) ( ) 表示??main???函數(shù)定義的開(kāi)始,第??}???7 行的右大括號(hào) ( ) 表示其結(jié)束。這些大括號(hào)之間的一切都是函數(shù)體,它定義了??main??調(diào)用時(shí)會(huì)發(fā)生什么。所有函數(shù)都使用大括號(hào)來(lái)表示其定義的開(kāi)始和結(jié)束。


第 6 行: ??std::cout << "Hello World!";??這一行是一個(gè) C++ 語(yǔ)句。語(yǔ)句是一種可以實(shí)際產(chǎn)生某種效果的表達(dá)式。它是程序的核心,指定其實(shí)際行為。語(yǔ)句的執(zhí)行順序與它們出現(xiàn)在函數(shù)體內(nèi)的順序相同。


該語(yǔ)句有三個(gè)部分:一是??std::cout??,它標(biāo)識(shí)標(biāo)準(zhǔn)輸出設(shè)備(通常,這是計(jì)算機(jī)屏幕)。其次,插入運(yùn)算符 ( ??<??),表示后面的內(nèi)容被插入到 中??std::cout??。最后,引號(hào)內(nèi)的句子(“Hello world!”)是插入到標(biāo)準(zhǔn)輸出中的內(nèi)容。


請(qǐng)注意,該語(yǔ)句以分號(hào) (??;??)。這個(gè)字符標(biāo)志著語(yǔ)句的結(jié)束,就像句號(hào)結(jié)束句子一樣。所有 C++ 語(yǔ)句都必須以分號(hào)字符結(jié)尾。C++ 中最常見(jiàn)的語(yǔ)法錯(cuò)誤之一是忘記以分號(hào)結(jié)束語(yǔ)句。


您可能已經(jīng)注意到,在執(zhí)行代碼時(shí),并非該程序的所有行都執(zhí)行操作。有一行包含注釋(以 開(kāi)頭??//???)。有一行帶有預(yù)處理器的指令(以 開(kāi)頭??#???)。有一行定義了一個(gè)函數(shù)(在本例中為??main???函數(shù))。最后,一行包含以分號(hào)結(jié)尾的語(yǔ)句(插入到??cout???),它位于由函數(shù)的大括號(hào) ( ??{ }???)分隔的塊內(nèi)??main??。


該程序已按不同的行構(gòu)建并適當(dāng)縮進(jìn),以便閱讀它的人更容易理解。但是 C++ 對(duì)縮進(jìn)或如何在不同行中拆分指令沒(méi)有嚴(yán)格的規(guī)則。例如,代替

int main ()
{
std::cout << " Hello World!";
}

我們可以這樣寫(xiě):

int main () { std::cout << "Hello World!"; }


全部在一行中,這與前面的代碼具有完全相同的含義。


在 C++ 中,語(yǔ)句之間的分隔是用結(jié)束分號(hào) ( ??;??)指定的,因此分隔成不同的行根本無(wú)關(guān)緊要。許多語(yǔ)句可以寫(xiě)在一行中,或者每個(gè)語(yǔ)句都可以多帶帶一行。代碼在不同行中的劃分只是為了讓可能閱讀它的人更易讀和更具示意圖,但對(duì)程序的實(shí)際行為沒(méi)有影響。


現(xiàn)在,讓我們?cè)谖覀兊牡谝粋€(gè)程序中添加一條額外的語(yǔ)句:

// my second program in C++
#include

int main ()
{
std::cout << "Hello World! ";
std::cout << "Im a C++ program";
}


在這種情況下,程序??std::cout???在兩個(gè)不同的語(yǔ)句中執(zhí)行了兩次插入。再一次,不同代碼行的分離只是為程序提供了更大的可讀性,因?yàn)??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";
}

結(jié)果將再次與前面的示例完全相同。


預(yù)處理器指令(那些以 開(kāi)頭的指令??#???)不屬于這個(gè)一般規(guī)則,因?yàn)樗鼈儾皇钦Z(yǔ)句。它們是在正確編譯開(kāi)始之前由預(yù)處理器讀取和處理的行。預(yù)處理器指令必須在它們自己的行中指定,并且因?yàn)樗鼈儾皇钦Z(yǔ)句,所以不必以分號(hào) ( ??;??)結(jié)尾。

注釋

如上所述,注釋不影響程序的運(yùn)行;然而,它們提供了一個(gè)重要的工具,可以直接在源代碼中記錄程序的功能和運(yùn)行方式。


C++ 支持兩種注釋代碼的方式:

// line comment
/* block comment */

第一個(gè),稱為行注釋,丟棄從找到斜杠 ( ??//??) 到同一行末尾的所有內(nèi)容。第二個(gè),稱為塊注釋,丟棄??/*???字符和字符第一次出現(xiàn)之間的所有內(nèi)容??*/??,可能包含多行。


讓我們?yōu)榈诙€(gè)程序添加注釋:

/* 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
}

如果在程序的源代碼中包含注釋而不使用注釋字符組合??//???,??/*???或??*/??,編譯器會(huì)將它們視為 C++ 表達(dá)式,很可能會(huì)導(dǎo)致編譯失敗并顯示一個(gè)或多個(gè)錯(cuò)誤消息。


使用命名空間 std

如果您之前看過(guò) C++ 代碼,您可能已經(jīng)看到??cout???使用??std::cout??. 兩者都命名同一個(gè)對(duì)象:第一個(gè)使用它的非限定名稱( ??cout??),而第二個(gè)直接在命名空間 內(nèi)限定它??std???(as ??std::cout??)。


??cout??是標(biāo)準(zhǔn)庫(kù)的一部分,標(biāo)準(zhǔn) C++ 庫(kù)中的所有元素都在所謂的命名空間中聲明:命名空間??std??。


為了參考元素的??std???命名空間的程序應(yīng)由有資格的每一個(gè)使用該庫(kù)的元素(如,我們通過(guò)做前綴??cout???與??std::??),或引入其組件的可見(jiàn)性。引入這些組件可見(jiàn)性的最典型方法是使用聲明

using namespace std;


上述聲明允許??std??以非限定方式(不帶??std::??前綴)訪問(wèn)命名空間中的所有元素。


考慮到這一點(diǎn),可以重寫(xiě)最后一個(gè)示例以對(duì)??cout??進(jìn)行不合格的使用:


// my second program in C++
#include
using namespace std;

int main ()
{
cout << "Hello World! ";
cout << "Im a C++ program";
}

訪問(wèn)??std??命名空間元素的兩種方式(顯式限定和使用聲明)在 C++ 中都是有效的,并且產(chǎn)生完全相同的行為。為簡(jiǎn)單起見(jiàn)并提高可讀性,這些教程中的示例將更頻繁地使用后一種方法和using聲明,但請(qǐng)注意,顯式限定是保證永遠(yuǎn)不會(huì)發(fā)生名稱沖突的唯一方法。


命名空間在后面的章節(jié)中有更詳細(xì)的解釋。