簡單控制結構

程式通常不限於指令的線性序列。 在其過程中,它可能會分支、重複程式碼或做出決策。 為此,C++ 提供了控制結構,用於指定我們的程式必須做什麼、何時以及在什麼情況下執行。

透過引入控制結構,我們將不得不引入一個新概念:複合語句。 塊是一組用分號 (;) 分隔的語句,就像所有 C++ 語句一樣,但分組在一個用大括號括起來的塊中{ }:

{ 語句1; 語句2; 語句3; }

我們將在本節中看到的大多數控制結構都需要一個通用語句作為其語法的一部分。 語句可以是簡單語句(以分號結尾的簡單指令)或複合語句(分組在一個塊中的多個指令),就像剛剛描述的那樣。 如果我們希望該語句是簡單語句,則不需要用大括號括起來({})。 但是,如果我們希望該語句是複合語句,則必須將其括在大括號之間({}),形成一個塊。

條件結構:if 和 else

要放回的字元的if關鍵字用於僅在滿足條件時執行語句或塊。 它的形式是

if (條件) 語句

其中條件是被評估的表示式。 如果此條件為真,語句將被執行。 如果為假,則語句將被忽略(不執行),程式在此條件結構之後繼續執行。
例如,以下程式碼片段列印x 是 100只有當x變數中儲存的值確實是100:

1
2
if (x == 100)
  cout << "x is 100";

如果希望在條件為真時執行多個語句,我們可以使用大括號指定一個塊{ }:

1
2
3
4
5
if (x == 100)
{
   cout << "x is ";
   cout << x;
}

我們還可以指定如果條件不滿足時我們希望發生什麼,方法是使用關鍵字else。它與if的 C++ 等效檔案是

if (條件) 語句1 else 語句2

例如:

1
2
3
4
if (x == 100)
  cout << "x is 100";
else
  cout << "x is not 100";

一起使用,在螢幕上列印x 是 100如果確實x的值為100,但如果沒有——並且只有在沒有的情況下——它會列印x 不是 100.

要放回的字元的if + else結構可以連線起來,以驗證一系列值。 以下示例顯示了它的使用,用於判斷當前儲存在x中的值是正數、負數還是零

1
2
3
4
5
6
if (x > 0)
  cout << "x is positive";
else if (x < 0)
  cout << "x is negative";
else
  cout << "x is 0";

請記住,如果希望執行多個語句,我們必須透過將它們括在大括號中將它們分組到一個塊中{ }.

迭代結構(迴圈)


迴圈的目的是重複一個語句一定次數或在滿足條件時重複執行。

while 迴圈

它的格式是

while (表示式) 語句

它的功能很簡單,就是重複執行語句,只要表示式中設定的條件為真。
例如,我們將使用 while 迴圈制作一個倒計時程式

// custom countdown using while

#include <iostream>
using namespace std;

int main ()
{
  int n;
  cout << "Enter the starting number > ";
  cin >> n;

  while (n>0) {
    cout << n << ", ";
    --n;
  }

  cout << "FIRE!\n";
  return 0;
}
Enter the starting number > 8
8, 7, 6, 5, 4, 3, 2, 1, FIRE!

當程式啟動時,會提示使用者插入倒計時的起始數字。 然後while迴圈開始,如果使用者輸入的值滿足條件n>0(即n大於零),則將執行並重復條件後面的塊,只要條件(n>0)仍然為真。

可以根據以下指令碼(從 main 開始)解釋先前程式的整個過程

  1. 使用者為n
  2. 賦值。檢查 while 條件 (n>0)。 此時有兩種可能性
    * 條件為真:執行語句(到第 3 步)
    * 條件為假:忽略語句並在其後繼續(到第 5 步)
  3. 執行語句
    cout << n << ", ";
    --n;
    (在螢幕上列印n的值,並將n減小1)
  4. 塊的結尾。 自動返回到步驟 2
  5. 在塊之後繼續程式:列印 FIRE! 並結束程式。

在建立 while 迴圈時,我們必須始終考慮到它必須在某個時刻結束,因此我們必須在塊內提供某種方法來強制條件在某個時刻變為假,否則迴圈將永遠迴圈下去。 在這種情況下,我們包含了--n;,它將條件中正在評估的變數 (n) 的值減 1 - 這最終會使條件 (n>0) 在一定數量的迴圈迭代後變為假:更具體地說,當n變成0時,我們的 while 迴圈和倒計時結束。

當然,對於我們的計算機來說,這是一個非常簡單的操作,整個倒計時都會立即執行,數字之間沒有任何實際延遲。

do-while 迴圈


它的格式是

do 語句 while (條件);

它的功能與 while 迴圈完全相同,除了條件在 do-while 迴圈中,是在語句執行之後而不是之前評估,從而至少執行一次語句,即使條件永遠無法滿足。 例如,以下示例程式會回顯您輸入的任何數字,直到您輸入0.

// number echoer

#include <iostream>
using namespace std;

int main ()
{
  unsigned long n;
  do {
    cout << "Enter number (0 to end): ";
    cin >> n;
    cout << "You entered: " << n << "\n";
  } while (n != 0);
  return 0;
}
Enter number (0 to end): 12345
You entered: 12345
Enter number (0 to end): 160277
You entered: 160277
Enter number (0 to end): 0
You entered: 0

do-while 迴圈通常用於必須確定迴圈結束的條件迴圈語句本身內確定,例如在前面的情況中,塊內的使用者輸入用於確定迴圈是否必須結束。 事實上,如果您從未輸入值0在前面的示例中,您可以永遠被提示輸入更多數字。

for 迴圈


它的格式是

for (初始化; 條件; 遞增) 語句;

它的主要功能是重複語句while條件保持為真,就像 while 迴圈一樣。 但此外,,對於迴圈提供了特定的位置來包含初始化語句和遞增語句。 因此,此迴圈專門用於使用計數器執行重複操作,計數器在每次迭代時都會初始化和遞增。

它的工作方式如下

  1. 初始化被執行。 通常,它是計數器變數的初始值設定。 這僅執行一次。
  2. 條件被檢查。 如果為真,則迴圈繼續,否則迴圈結束並且語句被跳過(不執行)。
  3. 語句被執行。 與往常一樣,它可以是單個語句或括在大括號中的塊{ }.
  4. 最後,無論在遞增欄位中指定什麼,都會被執行,迴圈返回到步驟 2。

這是一個使用 for 迴圈進行倒計時的示例

// countdown using a for loop
#include <iostream>
using namespace std;
int main ()
{
  for (int n=10; n>0; n--) {
    cout << n << ", ";
  }
  cout << "FIRE!\n";
  return 0;
}
10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FIRE!

要放回的字元的初始化遞增欄位是可選的。 它們可以保持為空,但在所有情況下,它們之間的分號必須書寫。 例如,我們可以寫for (;n<10;)如果我們不想指定初始化和遞增;或者for (;n<10;n++)如果我們想包含遞增欄位但沒有初始化(也許是因為變數已經在之前初始化了)。

可選地,使用逗號運算子 (,) 我們可以指定多個表示式,對於迴圈中包含的任何欄位,例如在初始化中。 逗號運算子 (,) 是表示式分隔符,它用於分隔多個表示式,而通常只期望一個表示式。 例如,假設我們想在迴圈中初始化多個變數

1
2
3
4
for ( n=0, i=100 ; n!=i ; n++, i-- )
{
   // whatever here...
}

如果ni在迴圈內未修改,則此迴圈將執行 50 次。


n0的值開始,而i100開始,條件是n!=i(即n不等於i)。 因為n增加 1,而i減少 1,迴圈條件將在第 50 個迴圈之後變為假,此時ni將等於50.

跳轉語句。


break 語句


使用break我們可以離開迴圈,即使迴圈結束的條件沒有滿足。 它可用於結束無限迴圈,或強制其在自然結束之前結束。 例如,我們將停止倒計時,在自然結束之前(可能是因為發動機檢查失敗?)

// break loop example

#include <iostream>
using namespace std;

int main ()
{
  int n;
  for (n=10; n>0; n--)
  {
    cout << n << ", ";
    if (n==3)
    {
      cout << "countdown aborted!";
      break;
    }
  }
  return 0;
}
10, 9, 8, 7, 6, 5, 4, 3, countdown aborted!

continue 語句


要放回的字元的continue語句使程式跳過當前迭代中迴圈的其餘部分,就好像已到達語句塊的末尾一樣,從而導致它跳轉到以下迭代的開始。 例如,我們將在倒計時中跳過數字 5

// continue loop example
#include <iostream>
using namespace std;

int main ()
{
  for (int n=10; n>0; n--) {
    if (n==5) continue;
    cout << n << ", ";
  }
  cout << "FIRE!\n";
  return 0;
}
10, 9, 8, 7, 6, 4, 3, 2, 1, FIRE!

goto 語句

goto允許絕對跳轉到程式中的另一個點。 您應該謹慎使用此功能,因為它的執行會導致無條件跳轉,而忽略任何型別的巢狀限制。
目標點由標籤標識,然後該標籤用作 goto 語句的引數。 標籤由有效的識別符號後跟冒號 (::).

一般來說,除了那些低階程式設計愛好者可能找到的用途外,此指令在結構化或面向物件的程式設計中沒有具體的用途。 例如,這是我們使用goto:

// goto loop example

#include <iostream>
using namespace std;

int main ()
{
  int n=10;
  loop:
  cout << n << ", ";
  n--;
  if (n>0) goto loop;
  cout << "FIRE!\n";
  return 0;
}
10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FIRE!

exit 函式


exit是一個在cstdlib庫中定義的函式。

的目的exit是使用特定的退出程式碼終止當前程式。 它的原型是

1
void exit (int exitcode);

要放回的字元的exitcode被某些作業系統使用,並且可能被呼叫程式使用。 按照慣例,退出程式碼為0意味著程式正常完成,任何其他值意味著發生了一些錯誤或意外結果。

選擇性結構:switch。

switch 語句的語法有點特殊。 它的目的是檢查表示式的幾個可能的常量值。 類似於我們在本節開頭使用幾個ifelse if指令連線所做的事情。 它的形式如下

switch (expression)
{
case constant1:
group of statements 1;
break;
case constant2:
group of statements 2;
break;
.
.
.
default:
default group of statements
}

它的工作方式如下:switch 評估表示式並檢查它是否等效於常量1,如果是,它將執行語句組 1直到找到break語句。 當它找到這個break語句時,程式跳轉到switch選擇性結構的結尾。

如果表示式不等於常量1,則將針對常量2進行檢查。 如果它等於這個,它將執行語句組 2直到找到 break 關鍵字,然後將跳轉到switch選擇性結構的結尾。

的結尾。最後,如果表示式的值與任何先前指定的常量都不匹配(您可以根據要檢查的值包括任意數量的case標籤),程式將執行包含在default標籤之後的語句(如果存在)(因為它是可選的)。

以下兩個程式碼片段具有相同的行為

switch 示例if-else 等效
switch (x) {
case 1:
cout "x is 1";
break;
case 2:
cout "x is 2";
break;
default:
cout "value of x unknown";
}
if (x == 1) {
cout "x is 1";
}
else if (x == 2) {
cout "x is 2";
}
else {
cout "value of x unknown";
}

要放回的字元的switch語句在 C++ 語言中有點特殊,因為它使用標籤而不是塊。 這迫使我們在我們想要為特定條件執行的語句組之後放置break語句。 否則,其餘語句——包括那些對應於其他標籤的語句——也將被執行,直到到達switch選擇性塊的末尾或到達break語句。

例如,如果我們不在第一個 case 組之後包含break語句,程式將不會自動跳轉到switch選擇性塊的結尾,並且它將繼續執行其餘語句,直到它到達break指令或switch選擇性塊的結尾。 這使得沒有必要包含大括號{ }圍繞每個 case 的語句,並且它也可以用於為表示式的不同可能值執行相同的指令塊。 例如

1
2
3
4
5
6
7
8
9
switch (x) {
  case 1:
  case 2:
  case 3:
    cout << "x is 1, 2 or 3";
    break;
  default:
    cout << "x is not 1, 2 nor 3";
  }

請注意,switch 只能用於將表示式與常量進行比較。 因此,我們不能將變數作為標籤(例如case n,其中n是一個變數)或範圍 (case (1..3)),因為它們不是有效的 C++ 常量。

如果您需要檢查範圍或非常量的值,請使用ifelse if語句的連線。
Index
目錄