程式結構

學習一門程式語言最好的方法就是編寫程式。通常,初學者編寫的第一個程式叫作“Hello World”,它只會在你的電腦螢幕上打印出“Hello World”。雖然這個程式非常簡單,但它包含了 C++ 程式所擁有的所有基本元件。

// my first program in C++
#include <iostream>

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

上方左側面板顯示了該程式的 C++ 程式碼。右側面板顯示了程式由計算機執行後的結果。面板左側的灰色數字是行號,方便討論程式和研究錯誤。它們不是程式的一部分。

讓我們逐行研究這個程式:

第 1 行:// my first program in C++
兩個斜槓符號表示該行餘下的部分是程式設計師插入的註釋,它對程式的行為沒有影響。程式設計師使用註釋來對程式碼或程式進行簡短的解釋或說明。在這裡,它是一個對程式的簡要介紹。

第 2 行:#include <iostream>
以井號(#)開頭的行是由所謂的預處理器讀取和解釋的指令。它們是在程式本身開始編譯之前被解釋的特殊行。在這裡,指令 #include <iostream> 指示預處理器包含一段名為標頭檔案 iostream 的標準 C++ 程式碼,該程式碼允許執行標準的輸入和輸出操作,例如將本程式的輸出(Hello World)寫入螢幕。

第 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,它標識了standard)dard)character)output)輸出裝置(通常是電腦螢幕)。其次,是插入運算子(<<),它表示後面的內容被插入到 std::cout 中。最後,引號內的句子("Hello world!"),是插入到標準輸出中的內容。

請注意,該語句以分號(;)結尾。這個字元標誌著語句的結束,就像英文中的句號結束一個句子一樣。所有 C++ 語句都必須以分號字元結束。C++ 中最常見的語法錯誤之一就是忘記用分號結束語句。

你可能已經注意到,並非這個程式的所有行在程式碼執行時都會執行操作。有一行包含註釋(以 // 開頭)。有一行是給預處理器的指令(以 # 開頭)。有一行定義了一個函式(在此例中是 main 函式)。最後,還有一行是以分號結尾的語句(向 cout 插入內容),它位於 main 函式的大括號({ })界定的程式碼塊內。

為了方便人類閱讀和理解,該程式被組織成不同的行並進行了適當的縮排。但 C++ 對於縮排或如何將指令拆分到不同行並沒有嚴格的規定。例如,我們本可以寫成:

1
2
3
4
int main ()
{
  std::cout << " Hello World!";
}

我們本可以寫成:
1
int main () { std::cout << "Hello World!"; }

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

在 C++ 中,語句之間的分隔是用結尾的分號(;)來指定的,將其分成不同的行對此目的而言根本不重要。許多語句可以寫在一行,或者每個語句可以單獨佔一行。將程式碼分成不同的行僅僅是為了讓閱讀它的人類覺得更易讀、更清晰,但對程式的實際行為沒有影響。

現在,讓我們為我們的第一個程式新增一個額外的語句:

// my second program in C++
#include <iostream>

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

在這種情況下,程式在兩個不同的語句中向 std::cout 執行了兩次插入操作。再次強調,將程式碼分成不同的行僅僅是為了提高程式的可讀性,因為 main 函式完全可以有效地定義成這樣:

1
int main () { std::cout << " Hello World! "; std::cout << " I'm a C++ program "; }

原始碼也可以被分成更多的程式碼行:

1
2
3
4
5
6
7
int main ()
{
  std::cout <<
    "Hello World!";
  std::cout
    << "I'm a C++ program";
}

其結果與前面的例子也完全相同。

預處理器指令(以 # 開頭的那些)不屬於這個通用規則,因為它們不是語句。它們是在正式編譯開始之前由預處理器讀取和處理的行。預處理器指令必須單獨佔用一行,並且因為它們不是語句,所以不必以分號(;)結尾。

註釋

如上所述,註釋不影響程式的操作;然而,它們提供了一個重要的工具,可以直接在原始碼中記錄程式的功能和執行方式。

C++ 支援兩種註釋程式碼的方式:

1
2
// line comment
/* block comment */

第一種,稱為行註釋,會忽略從雙斜槓符號(//)出現處到該行末尾的所有內容。第二種,稱為塊註釋,會忽略從 /* 字元到首次出現的 */ 字元之間的所有內容,並且可以包含多行。

讓我們為我們的第二個程式添加註釋:

/* my second program in C++
   with more comments */

#include <iostream>

int main ()
{
  std::cout << "Hello World! ";     // prints Hello World!
  std::cout << "I'm a C++ program"; // prints I'm a C++ program
}
Hello World! I'm a C++ program

如果在程式的原始碼中包含了註釋,但沒有使用註釋字元組合 ///**/,編譯器會把它們當作 C++ 表示式,這極有可能導致編譯失敗並出現一個或多個錯誤資訊。

使用名稱空間 std

如果你以前見過 C++ 程式碼,你可能見過使用 cout 而不是 std::cout 的情況。兩者都指向同一個物件:前者使用其非限定名稱cout),而後者則直接在名稱空間 std 中對其進行限定(如 std::cout)。

cout 是標準庫的一部分,標準 C++ 庫中的所有元素都在一個所謂的名稱空間(namespace)中宣告:即名稱空間 std

為了引用 std 名稱空間中的元素,程式要麼對庫中元素的每一次使用都進行限定(就像我們透過在 cout 前加上 std:: 所做的那樣),要麼引入其元件的可見性。引入這些元件可見性的最典型方式是透過 using 宣告

1
using namespace std;

上述宣告允許以非限定方式(不帶 std:: 字首)訪問 std 名稱空間中的所有元素。

考慮到這一點,最後一個例子可以改寫為對 cout 進行非限定使用,如下所示:
// my second program in C++
#include <iostream>
using namespace std;

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

訪問 std 名稱空間元素的兩種方式(顯式限定和 using 宣告)在 C++ 中都是有效的,並且產生完全相同的行為。為簡單起見並提高可讀性,這些教程中的示例將更常用後一種帶 using 宣告的方法,但請注意,顯式限定是保證永遠不會發生名稱衝突的唯一方法。

名稱空間將在後面的章節中更詳細地解釋。
Index
目錄