跳转至

分支

一個程序默認是按照代碼的順序執行下來的,有時我們需要選擇性的執行某些語句,這時候就需要分支的功能來實現。選擇合適的分支語句可以提高程序的效率。

if 語句

基本 if 語句

以下是基本 if 語句的結構。

1
2
3
if (條件) {
  主體;
}

if 語句通過對條件進行求值,若結果為真(非 0),執行語句,否則不執行。

如果主體中只有單個語句的話,花括號可以省略。

if...else 語句

1
2
3
4
5
if (條件) {
  主體1;
} else {
  主體2;
}

if...else 語句和 if 語句類似,else 不需要再寫條件。當 if 語句的條件滿足時會執行 if 裏的語句,if 語句的條件不滿足時會執行 else 裏的語句。同樣,當主體只有一條語句時,可以省略花括號。

else if 語句

1
2
3
4
5
6
7
8
9
if (條件1) {
  主體1;
} else if (條件2) {
  主體2;
} else if (條件3) {
  主體3;
} else {
  主體4;
}

else if 語句是 if 和 else 的組合,對多個條件進行判斷並選擇不同的語句分支。在最後一條的 else 語句不需要再寫條件。例如,若條件 1 為真,執行主體 1,條件 3 為真而條件 1 和條件 2 都為假,執行主體 3,所有的條件都為假才執行主體 4。

實際上,這一個語句相當於第一個 if 的 else 分句只有一個 if 語句,就將花括號省略之後放在一起了。如果條件相互之間是並列關係,這樣寫可以讓代碼的邏輯更清晰。

在邏輯上,大約相當於這一段話:

解一元二次方程的時候,方程的根與判別式的關係:

  • 如果 (\(\Delta<0\)) 方程無解;
  • 否則,如果 (\(\Delta=0\)) 方程有兩個相同的實數解;
  • 否則 方程有兩個不相同的實數解;

switch 語句

1
2
3
4
5
6
7
8
switch (選擇句) {
  case 標籤1:
    主體1;
  case 標籤2:
    主體2;
  default:
    主體3;
}

switch 語句執行時,先求出選擇句的值,然後根據選擇句的值選擇相應的標籤,從標籤處開始執行。其中,選擇句必須是一個整數類型表達式,而標籤都必須是整數類型的常量。例如:

1
2
3
4
5
6
int i = 1;  // 這裏的 i 的數據類型是整型 ,滿足整數類型的表達式的要求

switch (i) {
  case 1:
    cout << "OI WIKI" << endl;
}
1
2
3
4
5
6
7
8
char i = 'A';

// 這裏的 i 的數據類型是字符型 ,但 char
// 也是屬於整數的類型,滿足整數類型的表達式的要求
switch (i) {
  case 'A':
    cout << "OI WIKI" << endl;
}

switch 語句中還要根據需求加入 break 語句進行中斷,否則在對應的 case 被選擇之後接下來的所有 case 裏的語句和 default 裏的語句都會被運行。具體例子可看下面的示例。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
char i = 'B';

switch (i) {
  case 'A':
    cout << "OI" << endl;
    break;

  case 'B':
    cout << "WIKI" << endl;

  default:
    cout << "Hello World" << endl;
}

以上代碼運行後輸出的結果為 WIKIHello World,如果不想讓下面分支的語句被運行就需要 break 了,具體例子可看下面的示例。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
char i = 'B';

switch (i) {
  case 'A':
    cout << "OI" << endl;
    break;

  case 'B':
    cout << "WIKI" << endl;
    break;

  default:
    cout << "Hello World" << endl;
}

以上代碼運行後輸出的結果為 WIKI,因為 break 的存在,接下來的語句就不會繼續被執行了。最後一個語句不需要 break,因為下面沒有語句了。

處理入口編號不能重複,但可以顛倒。也就是説,入口編號的順序不重要。各個 case(包括 default)的出現次序可任意。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
char i = 'B';

switch (i) {
  case 'B':
    cout << "WIKI" << endl;
    break;

  default:
    cout << "Hello World" << endl;
    break;

  case 'A':
    cout << "OI" << endl;
}

switch 的 case 分句中也可以選擇性的加花括號。不過要注意的是,如果需要在 switch 語句中定義變量,花括號是必須要加的。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
char i = 'B';

switch (i) {
  case 'A': {
    int i = 1, j = 2;
    cout << "OI" << endl;
    ans = i + j;
    break;
  }

  case 'B': {
    int qwq = 3;
    cout << "WIKI" << endl;
    ans = qwq * qwq;
    break;
  }

  default: {
    cout << "Hello World" << endl;
  }
}
如何理解 switch

在上文中,用了大量「case 分句」,「case 子句」等用語,實際上,在底層實現中,switch 相當於一組跳轉語句。也因此,有 Duff's Device 這種奇技淫巧,希望瞭解的人可以自行學習。