C++ 的程式結構

極為常見

Hello World

這是一份會在執行後輸出 "Hello World" 文字的程式碼,接下來將以這份程式碼為例探討 C++ 的程式結構。

#include <iostream>

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

標頭檔

在上面範例程式的第一行,語法如下:

#include <標頭檔名稱>

標頭檔的作用是引入這一份程式碼用需要用到的「功能」,像是這份程式需要使用「輸入輸出功能」那我們就可以:

#include <iostream>
補充

iostream 的意思其實就是「input output stream」,也就是輸入輸出流,這個標頭檔裡面包含了很多輸入輸出的功能。

如果需要「數學相關功能」就可以:

#include <cmath>

以此類推。

但是,在程式寫得越來越多時,我們通常會需要很多很多的標頭檔,而且新手常常會忘記哪個功能的標頭檔是什麼。

#include <cmath>
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <time>
#include <threads>
// 更多標頭檔...

幸運的是 GCC ( GUN Compiler Collection ) 有提供一個好用的標頭檔,可以幫你一次引入所有常用的功能,那就是 bits/stdc++.h

#include <bits/stdc++.h>

於是我們可以把我們的程式碼改成這樣:

#include <bits/stdc++.h>

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

在台灣,我們通常稱它為「萬用標頭檔」。

補充

雖然在追求迅速解題檢定中我們建議直接使用 bits/stdc++.h,但如果是在實際的專案開發上這並不是一個很優雅的作法。

主函式

範例程式碼的第 3 ~ 5 行都算是主函式的範圍,語法如下:

int main() {
    // 這份程式碼主要要做的事情
}

主函式的功能就是告訴 C++ 這份程式碼「主要的部分」在哪裡(所以這東西叫做主函式),以範例程式碼來說,程式要輸出一段 "Hello World" 的文字,就要把輸出 "Hello World" 的部分寫在主函式裡面:

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

關於括號的作用是什麼、前面的 int 又有什麼作用將會在以後的 函式 章節詳細介紹,目前讀者只需要知道把主要的程式碼片段放在 {} 裡面就行了!而 cout 這個語法的更多使用方式也會在下個單元做更詳細的介紹。

命名空間

命名空間的主要功能就是幫一些函式或物件(可以先把他們當作一個語法)做分類,主要是為了防止名稱衝突,像是範例程式碼使用的:

std::cout

std 就是他的命名空間,而 cout 是本身的名稱,如此一來,C++ 就知道我們要使用的是 std 命名空間底下的 cout 功能。

#include <bits/stdc++.h>

int main() {
    std::cout << "Hey!\n";
    std::cout << "How are you?\n";
    std::cout << "I'm fine, thanks you!\n";
    std::cout << ":>\n";
}
補充

\n 的意思就是換行,在 跳脫字元 章節我們會再更詳細的介紹。

面對這種情況,C++ 也提供了一個更簡潔的作法:

using namespace std;

上面這段程式碼的功能是讓 C++ 省略所有 std 的命名空間,於是程式碼可以改成這樣:

#include <bits/stdc++.h>

using namespace std;

int main() {
    cout << "Hey!\n";
    cout << "How are you?\n";
    cout << "I'm fine, thanks you!\n";
    cout << ":>\n";
}

這樣就可以省略所有 std 的命名空間了!

分號

每行 C++ 程式碼中,用來「直接執行」的都需要加上分號,因為 C++ 其實不是用換行來判斷每段程式碼,也就是說,只要加上分號就算把大部分的程式碼都縮成一行也可以!

#include <bits/stdc++.h>
using namespace std; int main () {cout << "Hello "; cout << " World";}

不過,為了讓程式碼更好閱讀,通常不會選擇這麼做。

執行順序

C++ 會以由上而下的方式執行程式碼,也就是說,如果交換每行的順序,執行結果將會不同。

cout << "I";
cout << " love ";
cout << "APCS Guide";

// 輸出:I love APCS Guide
cout << "APCS Guide";
cout << " love ";
cout << "I";

// 輸出:APCS Guide love I

雖然應該要用 APCS Guide love me 文法才正確。

縮排

在程式碼中,常常會看到這種,看起來像是一個「很大的空白」的部分,像下面程式碼 cout 前面的那段:

int main() {
    cout << "Hey";
}

這個很大的空白,實際上就叫做「縮排」,縮排的用途就是表達「層級關係」,進而讓程式更容易閱讀,通常可以使用鍵盤上的 tab 鍵打出來。而上面的例子中,縮排表達的就是 cout 是在 main() 函式裡面的。

但有些新手還是喜歡寫沒有縮排的程式碼:

#include <bits/stdc++.h>
using namespace std;
int main() {
cout << "Hello World\n";
cout << "Hello World\n";
cout << "Hello World\n";
}

雖然縮排在現在看來可能微不足道,但當你的程式越來越複雜時,有沒有使用縮排程式碼可讀性看起來就會差非常多,因此建議讀者在一開始就可以養成這樣的習慣。

小測驗

下列哪個選項是正確的?