---
# System prepended metadata

title: 第五章 述句 筆記

---

# 第五章 述句 筆記

## 簡單述句

- 運算式述句（expression statement）：一個運算式尾端加上分號（semicolon），就是運算式述句（expression statement）
- 空述句（null expression）：只有一個單獨的分號（semicolon）
- 複合述句（compound expression 又稱區塊 block）：用大括號（curly braces）包圍起來的述句和宣告的一整個序列。而一個區塊（block）就是一個範疇（scope）

## 條件述句（if statement）

- 懸置 else（dangling else）：用來指說在巢狀（nested）的 if else 述句中，如果 if 比 else 多如何處理的問題。C++ 使用的方法是 else 與最近沒有配對到 else 的 if 配對，而如果該 else 找不到配對的 if 就是 danling else
- 某些 coding styles 建議永遠都在 if 或 else 後使用大括號（同樣適用於 while 與 for 述句）
- swtich 中的 case lable 後面接的必須是一個常數運算式（constant expression），因此後面放執行時期中可能換變動的變數會編譯錯誤，且如果有任兩個 case lable 後面接的常數運算式的值相同也會產生編譯錯誤

## 迭代式述句（iterative statements）

- while：當不確定到底要迭代多少次的時候，使用 while 會比較合適，比如讀取輸入的內容
- for：for 述句（statement）的標頭（header）可以省略掉 init-statement，condition 和 expression 的任何一个，甚至是全部
- range for：for (declaration: expression) statement
- do while：易忘！\\最後的 condition 後面必須要加上分號

## 跳躍述句（jump statements）

- break：break 述句負責中斷（interrupt）離他最近的 while、do while、for 或者 switch 述句，並且從這些述句之後的第一條述句開始繼續執行
- continue：中斷（interrupt）最接近的外圍迴圈目前的迭代，並且立即開始下一次的迭代。只能用在 while、do while、for 的内部
- goto：讓程式無條件跳躍到相同函式中的另一個述句，而因為會使程式難以理解而且不易修改，程式中應盡少使用 goto 述句

## try 區塊與例外處理（try-block and exception）

例外（exceptions）是執行時期發生的異常狀況，例如失去資料庫連線，或遭遇非預期的輸入，是在程式正常功能以外的異常。處理異常行為很可能會是設計任何系統時最困難的部分
- throw 運算式：偵測問題的部分（detecting part）中使用 throw 運算式來表示它遇到了無法處理的問題。我們會說一個 throw 提出（raise）一個例外（exception）
- try 區塊：以 try 關鍵字（keyword）開始，以一個或多個的 catch 字句结束。try 區塊中執行的程式碼所提出的例外通常會由其中一個 catch 來處理，因為它們負責處理（handle）例外（exception）。而 catch 子句也被稱為例外處理器（exception handler）
- exception 類別：用來在一個 throw 和與其關聯的一個 catch 之間傳遞所發生的事情的資訊，這些資訊以類別的形式呈現，並且被定義在四個標頭中：
    - exception 標頭定義最一般的例外類別，名為 exception。它所傳達的僅是有例外發生，但不提供額外資訊
    - stdexcept 標頭定義了數個一般用途的例外類別，列於下表
    - new 標頭定義 bad_alloc 例外型別，將在第 12 章涵蓋
    - type_info 標頭定義 bad_cast 例外型別，會在第 19 章涵蓋

### 定義於 \<stdexcept> 的標準例外類別

| 類別名稱 | 意義 |
|---|---|
| exception | 最一般的問題 |
| runtime_error | 只能在執行時期（run time）被偵測到的問題 |
| range_error | 執行期錯誤：產生的結果值超出了有意義的範圍 |
| overflow_error | 執行期錯誤：計算溢位了（overflowed） |
| underflow_error | 執行期錯誤：計算下溢了（underflowed） |
| logic_error | 程式邏輯中的錯誤|
| domain_error | 邏輯錯誤：所給的引數不存在結果 |
| invalid_error | 邏輯錯誤：不適當的引數 |
| length_error | 邏輯錯誤：試圖創建一個大於該型別最大大小的物件 |
| out_of_error | 邏輯錯誤：用了一個在有效範圍外的值 |