---
# System prepended metadata

title: 第一章 快速入門 筆記

---

# 第一章 快速入門 筆記

## 程式原始碼（source）檔案命名慣例（convention）

源碼檔案（source file）的名稱會以一個後綴（suffix）結尾，這後綴是以一個句號（period）後面接著一個或多個字元（characters）所組成，這個後綴會告訴系統檔案這是一個 C++ 程式，不同的編譯器使用不同的後綴慣例（convention），常見的有 .cxx、.cpp、.cc、.C
## 熟悉編譯器

以下僅以 GNU 發行的編譯器（compiler） g++ 為例：

- 編譯（compile）：g++ --std=c++11 ch01.cpp -o main
- 執行（execute）：./prog1

從程式進入點 main 函式進入後，直到程式結束，會 return 一個數字給作業系統（operation system），如果數字為 0 即代表正常結束，而非 0 則代表程式執行失敗

- 查看程式執行完後的狀態：echo $?
- 編譯多個文件：g++ main.cpp other1.cpp other2.cpp -o main

輸入 g++ --help，查看編譯器可使用的選項（options）：

```
Usage: g++ [options] file...
Options:
  -pass-exit-codes         Exit with highest error code from a phase
  --help                   Display this information
  --target-help            Display target specific command line options
  --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]
                           Display specific types of command line options
  (Use '-v --help' to display command line options of sub-processes)
  --version                Display compiler version information
  -dumpspecs               Display all of the built in spec strings
  -dumpversion             Display the version of the compiler
  -dumpmachine             Display the compiler's target processor
  -print-search-dirs       Display the directories in the compiler's search path
  -print-libgcc-file-name  Display the name of the compiler's companion library
  -print-file-name=<lib>   Display the full path to library <lib>
  -print-prog-name=<prog>  Display the full path to compiler component <prog>
  -print-multiarch         Display the target's normalized GNU triplet, used as
                           a component in the library path
  -print-multi-directory   Display the root directory for versions of libgcc
  -print-multi-lib         Display the mapping between command line options and
                           multiple library search directories
  -print-multi-os-directory Display the relative path to OS libraries
  -print-sysroot           Display the target libraries directory
  -print-sysroot-headers-suffix Display the sysroot suffix used to find headers
  -Wa,<options>            Pass comma-separated <options> on to the assembler
  -Wp,<options>            Pass comma-separated <options> on to the preprocessor
  -Wl,<options>            Pass comma-separated <options> on to the linker
  -Xassembler <arg>        Pass <arg> on to the assembler
  -Xpreprocessor <arg>     Pass <arg> on to the preprocessor
  -Xlinker <arg>           Pass <arg> on to the linker
  -save-temps              Do not delete intermediate files
  -save-temps=<arg>        Do not delete intermediate files
  -no-canonical-prefixes   Do not canonicalize paths when building relative
                           prefixes to other gcc components
  -pipe                    Use pipes rather than intermediate files
  -time                    Time the execution of each subprocess
  -specs=<file>            Override built-in specs with the contents of <file>
  -std=<standard>          Assume that the input sources are for <standard>
  --sysroot=<directory>    Use <directory> as the root directory for headers
                           and libraries
  -B <directory>           Add <directory> to the compiler's search paths
  -v                       Display the programs invoked by the compiler
  -###                     Like -v but options quoted and commands not executed
  -E                       Preprocess only; do not compile, assemble or link
  -S                       Compile only; do not assemble or link
  -c                       Compile and assemble, but do not link
  -o <file>                Place the output into <file>
  -pie                     Create a position independent executable
  -shared                  Create a shared library
  -x <language>            Specify the language of the following input files
                           Permissible languages include: c c++ assembler none
                           'none' means revert to the default behavior of
                           guessing the language based on the file's extension

```

輸入 g++ -v --help 可以看到更完整的指令。以下是其他常用的：

```
-h FILENAME, -soname FILENAME: Set internal name of shared library
-I PROGRAM, --dynamic-linker PROGRAM: Set PROGRAM as the dynamic linker to use
-l LIBNAME, --library LIBNAME: Search for library LIBNAME
-L DIRECTORY, --library-path DIRECTORY: Add DIRECTORY to library search path
```

獲得程式執行完後的狀態：

- windows：echo %ERRORLEVEL%
- unix：echo $?

```bash
g++ file.cpp -o file
file
echo $1
0 # 回傳 0 代表程式正常執行結束
```

註：如使用 windows 的 powershell 而非原生的 cmd，請改為使用 echo $LASTEXITCODE

## 初步認識輸入/輸出（input/output）

標準輸入輸出程式庫定義了四個 IO 物件：標準輸入 cin（standard input）、標準輸出 cout（standard output），標準錯誤 cerr、clog（standard error），而標準錯誤的 cerr 和 clog 之間的差異在於：cerr 沒有緩衝區（buffer），它會直接將輸出印在螢幕上，通常用來顯示錯誤訊息，而 clog 則是用來記錄程式執行過程中的一般資訊

範例：
```cpp
#include <iostream>  // 標準函式庫

#include "myheader.h"  // 自己額外製作的 header file
int main() {
  std::cout << "hello"` int input_num;
  std::cin >> input_num;
}
```

注意！運算子（operator）>> 和 << 的運算都是左結合（left associative）的，也就是 << 執行完後，會留下左邊的物件，也就是 cout 和 cin 本身

endl：這是一個被稱作操控符（manipulator）的特殊值，效果是：結束當前所在的行，並且將周邊設備（peripherals）的緩衝區（buffer）中的内容刷（flush）到設備中

unix 和 mac 下鍵盤的輸入文件結束符號（end-of-file），使用 ctrl + d 代表一個文件的結尾，而 windows 中則是使用 ctrl + z

標頭檔（header）：類別的類型一般都儲存在標頭檔之中，對於標準函式庫的標頭檔要使用一對角括號（angle brackets）框起來，而非標準庫的標頭則使用雙引號（double quotation marks），宣告要寫在 .h 文件，類別的定義和實作則寫在 .cpp 文件之中

標頭保護（header guard）：使用 ifndef、define 巨集（macro）以避免多次包含同一頭文件造成無法編譯的情況

```cpp
#ifndef SALESITEM_H
#define SALESITEM_H
// Definition of Sales_itemclass and related functions goes here
#endif
```

使用點號運算子（dot operator） . 表示我們想用該物件的某個成員，左手邊的運算元（operands）必須是類別型別的一個物件，而右手邊的運算元必須是該型別的一個成員名稱，可以是成員變數（member variable）也可以是成員函式（member function 又稱方法 method）

命名空間（namespace）：使用範圍運算子（scope operator） :: 呼叫

## 註解（comments）

- 單行註解：使用雙斜線（double slash）//
- 多行註解：使用 /**/，編譯器會將 /* 和 */ 之間的內容都作為註解內容而忽略

但當一個註解有跨越多行，通常比較好的做法是在視覺上凸顯內部文字行，讓讀者知道它們是一個多行註解的一部分。我們的風格是以一個星號（asterisk）作為註解每一行的開頭，指出該行是屬於多行註解的一部分

```cpp
#define SALESITEM_H
/*
 * 多行註解格式
 * 每一行的開頭都會加上一個 *
 */
```
## while 述句（while statement）

循環執行，直到條件式（condition）為 false

## for 述句（for statement）

for 述句的標頭（header 此 header 並非指 .h 檔的 header）由三個部分组成：

- 一個初始述句（init-statement）
- 一個條件（condition）
- 一個運算式（expression）

## 使用檔案重導（file redirection）

```bash
./main <infile >outfile
```

- main 是執行檔名稱
- infile 作為資料輸入檔
- outfile 作為資料輸出檔

使用檔案重導這會使原本要印出在螢幕上的文字，改部改為輸入到 outfile 文件中，而原本要從螢幕輸入的資料，也會改為從 infile 中汲取