程式結構

學習程式語言最好的方式可能是編寫一個程式。因此,這裡是我們的第一個程式。

// my first program in C++

#include <iostream>
using namespace std;

int main ()
{
  cout << "Hello World!";
  return 0;
}
Hello World!

第一個面板(淺藍色)顯示了我們第一個程式的原始碼。第二個面板(淺灰色)顯示了程式編譯和執行後的結果。在左邊,灰色的數字代表行號 - 這些不是程式的一部分,只是為了提供資訊。

編輯和編譯程式的方式取決於你使用的編譯器。取決於它是否有開發介面以及它的版本。如果你對如何編譯 C++ 控制檯程式有疑問,請查閱編譯器章節以及編譯器附帶的手冊或幫助。

之前的程式是程式設計初學者第一次編寫的典型程式,它的結果是在螢幕上列印 "Hello World!" 句子。它是可以用 C++ 編寫的最簡單的程式之一,但它已經包含了每個 C++ 程式都具有的基本組成部分。我們將逐行檢視我們剛剛編寫的程式碼。

// 這是我的第一個 C++ 程式
這是一條註釋行。所有以兩個斜槓符號 (//) 開頭的行都被認為是註釋,並且對程式的行為沒有任何影響。程式設計師可以使用它們在原始碼中包含簡短的解釋或說明。在本例中,該行是對我們程式的簡要描述。
#include <iostream>
以井號 (#) 開頭的行是預處理指令。它們不是帶有表示式的常規程式碼行,而是編譯器預處理器的指示。在本例中,指令 #include <iostream> 告訴預處理器包含 iostream 標準檔案。這個特定的檔案 (iostream) 包含了 C++ 中基本標準輸入輸出庫的宣告,包含它是因為稍後將在程式中使用它的功能。
using namespace std;
標準 C++ 庫的所有元素都在一個叫做名稱空間的東西中宣告,這個名稱空間的名字是 std。所以為了訪問它的功能,我們用這個表示式宣告我們將使用這些實體。這一行在使用標準庫的 C++ 程式中非常常見,事實上,它將被包含在這些教程中包含的大多數原始碼中。
int main ()
這一行對應於 main 函式定義的開始。無論它在原始碼中的位置如何,main 函式都是所有 C++ 程式開始執行的地方。不管之前或之後是否定義了其他帶有其他名稱的函式 - 包含在這個函式定義中的指令將永遠是 C++ 程式中首先執行的指令。出於同樣的原因,所有 C++ 程式都必須有一個 main 函式。

程式碼中 main 這個詞後面跟著一對圓括號 (())。那是因為它是一個函式宣告:在 C++ 中,將函式宣告與其他型別的表示式區分開來的是這些跟隨在其名稱之後的括號。可選地,這些括號可能包含一個引數列表。

在這些括號之後,我們可以找到 main 函式的主體,用大括號 ({}) 括起來。包含在這些大括號中的內容是函式執行時的行為。
cout << "Hello World!";
這一行是一個 C++ 語句。語句是一個可以實際產生某種效果的簡單或複合表示式。事實上,這個語句執行了我們第一個程式中產生可見效果的唯一動作。

cout 是 C++ 中標準輸出流的名稱,整個語句的含義是將一個字元序列(在本例中是 Hello World 字元序列)插入到標準輸出流(cout,通常對應於螢幕)中。

coutstd 名稱空間中的 iostream 標準檔案中宣告,所以這就是為什麼我們需要包含這個特定檔案,並宣告我們將在程式碼中稍後使用這個特定的名稱空間。

請注意,該語句以分號字元 (;) 結尾。這個字元用於標記語句的結束,事實上,它必須包含在所有 C++ 程式中所有表示式語句的末尾(最常見的語法錯誤之一確實是忘記在語句後包含分號)。
return 0;
return 語句導致 main 函式結束。 return 後面可以跟一個返回碼(在我們的例子中,後面跟一個值為零的返回碼)。main 函式的返回碼 0 通常被解釋為程式執行正常,在執行過程中沒有出現任何錯誤。這是結束 C++ 控制檯程式最常用的方式。

您可能已經注意到,並非該程式的所有行在執行程式碼時都會執行操作。有一些行只包含註釋(那些以 // 開頭的)。有一些行帶有編譯器的預處理器指令(那些以 # 開頭的)。然後有一些行開始宣告一個函式(在本例中是 main 函式),最後是一些帶有語句的行(比如插入到 cout 中),這些行都包含在 main 函式的大括號 ({}) 分隔的塊中。

該程式已被結構化為不同的行,以便更具可讀性,但在 C++ 中,我們沒有關於如何在不同行中分隔指令的嚴格規則。例如,代替

1
2
3
4
5
int main ()
{
  cout << " Hello World!";
  return 0;
}

我們可以寫

1
int main () { cout << "Hello World!"; return 0; }

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

在 C++ 中,語句之間的分隔是透過在每個語句末尾加上分號 (;) 來指定的,因此,不同程式碼行中的分隔對於這個目的來說根本不重要。我們可以每行編寫多個語句,或者編寫一個佔用多行程式碼的單個語句。在不同的行中劃分程式碼只是為了使其對於可能閱讀它的人來說更易讀和示意性。

讓我們向我們的第一個程式新增一個額外的指令

// my second program in C++

#include <iostream>

using namespace std;

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

在這種情況下,我們在兩個不同的語句中對 cout 執行了兩次插入。再次,在不同的程式碼行中進行分隔只是為了使程式更具可讀性,因為 main 完全可以這樣定義

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

如果我們認為更方便,我們也可以自由地將程式碼分成更多行

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

結果將與之前的示例完全相同。

預處理器指令(那些以 # 開頭的)不在此一般規則之內,因為它們不是語句。它們是由預處理器讀取和處理的行,並且本身不會生成任何程式碼。預處理器指令必須在自己的行中指定,並且不必以分號 (;) 結尾。

註釋


註釋是原始碼中被編譯器忽略的部分。它們什麼也不做。它們的目的是隻允許程式設計師在原始碼中嵌入註釋或描述。

C++ 支援兩種插入註釋的方式

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

其中第一個,被稱為行註釋,丟棄從找到斜槓對 (//) 的位置到同一行末尾的所有內容。第二個,被稱為塊註釋,丟棄 /* 字元和第一次出現 */ 字元之間的所有內容,並且可以包含多行。
我們將向我們的第二個程式添加註釋

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

#include <iostream>
using namespace std;

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

如果在程式的原始碼中包含註釋而不使用註釋字元組合 ///**/,編譯器將把它們當作 C++ 表示式,很可能會在編譯時導致一個或多個錯誤訊息。
Index
目錄