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