C++ break和continue用法詳解

2020-07-16 10:04:39
用於 switch 中的 break 語句也可以放在迴圈中,當遇到 break 時,迴圈立即停止,程式跳轉到回圈後面的語句。

以下是一個帶有 break 語句的迴圈範例。程式段中的 while 迴圈看起來要執行 10 次,但 break 語句導致它在第 5 次疊代後即停止:
int count = 1;
while (count <= 10)
{
    cout << count << endl;
    count++;
    if (count == 6)
        break;
}
這個例子只是為了說明在迴圈中的 break 語句的作用。通常不會有人以這種方式來使用它,因為它違反了結構化程式設計的規則,並使程式碼難以理解、偵錯和維護。

一個迴圈的退出應該通過迴圈頂部的條件測試來控制,就像在 while 迴圈或 for 迴圈中那樣,或者在底部,就像在 do-while 迴圈中那樣。通常在迴圈中使用 break 語句的唯一時間是在發生錯誤的情況下提前退出迴圈。下面的程式提供了這樣一個範例:
#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    double number;
    cout << "Enter 5 positive numbers separated by spaces and n" << "I will find their square roots: ";
    for (int count = 1; count <= 5; count++)
    {
        cin >> number;
        if (number >= 0.0)
        {
            cout << "nThe square root of " << number << " is " << sqrt(number) <<endl;
        }
        else
        {
            cout << number << " is negative. " << "I cannot find the square root of a negative number. The program is terminating.n";
            break;
        }
    }
    return 0;
}
程式輸出結果:

Enter 5 positive numbers separated by spaces and I will find their square roots: 12 15 -17 19 31
The square root of 12 is 3.4641
The square root of 15 is 3.87298
-17 is negative. I cannot find the square root of a negative number. The program is terminating.

在巢狀迴圈中使用 break

在巢狀迴圈中,break 語句只會中斷其所在位置的迴圈。以下程式段在螢幕上顯示 5 行星號。外部迴圈控制行數,內部迴圈控制每行中的星號數。內部迴圈設計為顯示 20 個星號,但是 break 語句使迴圈在第 11 次疊代中停止。
for (row = 0; row < 3; row++)
{
    for (star = 0; star < 20; star++)
    {
        cout << '*';
        if (star == 10)
            break;
    }
    cout << endl;
}
該程式段的輸出結果如下:

***********
***********
***********

continue 語句

有時候可能想要保持迴圈,但又想讓當前疊代立即結束,這時可以通過 continue 語句來完成。

當遇到 continue 時,出現在它之後的迴圈體中的所有語句都被忽略,迴圈準備下一次疊代。在 while 迴圈中,這意味著程式跳轉到回圈頂部的測試表示式。如果表示式仍然為 true,則下一次疊代開始,否則,迴圈退出。在 do-while 迴圈中,程式跳轉到回圈底部的測試表示式,它決定下一次疊代是否開始。在 for 迴圈中,continue 會導致更新表示式被執行,然後測試表示式被評估。

以下程式段表示在 while 迴圈中使用 continue:
int testVal = 0;
while (testVal < 10)
{
    testVal++;
    if (testVal) == 4
        continue; //終止迴圈的該次疊代
    cout << testVal << " ";
}
這個迴圈看起來像是要顯示整數 1?10。但是,其實際輸出如下:

1 2 3 5 6 7 8 9 10

請注意,數位未不列印。這是因為當 testVal 等於 4 時,continue 語句會導致迴圈跳過 cout 語句並開始下一次疊代。

注意,與 break 語句一樣,continue 語句違反了結構化程式設計規則,使得程式碼難以理解、偵錯和維護。因此,應該謹慎使用 continue。

當然,continue 語句有一些實際用途,下面的程式說明了其中的一個應用。該程式計算 DVD 租賃的費用,current releases 版本費用為 3.50 美元,所有其他版本費用為 2.50 美元。如果一個客戶租了幾張 DVD,每 3 張有 1 張是免費的。continue 語句用於跳過計算每個第 3 張 DVD 費用的迴圈部分。
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    int numDVDs;    // Number of DVDs being rented 
    double total = 0.0; // Accumulates total charges for all DVDs
    char current; // Current release? (Y/N)
   
    // Get number of DVDs rented
    cout << "How many DVDs are being rented?";
    cin >> numDVDs;
   
    //Determine the charges
    for (int dvdCount = 1; dvdCount <= numDVDs; dvdCount++)
    {
        if (dvdCount % 3 == 0)// If it's a 3rd DVD itT s free
        {
            cout <<" DVD #" << dvdCount << " is free! n";
            continue;
        }
        cout << "Is DVD #" << dvdCount << " a current release (Y/N) ? ";
        cin » current;
        if ( (current == 'Y') || (current == 'y'))
            total += 3.50;
        else
            total += 2.50;
    }
    //Display the total charges
    cout << fixed << showpoint << setprecision(2);
    cout << "The total is $" << total << endl;
    return 0;
}
程式輸出結果:

How many DVDs are being rented? 6
Is DVD #1 a current release (Y/N) ? y
Is DVD #2 a current release (Y/N) ? n
DVD #3 is free!
Is DVD #4 a current release (Y/N)? n
Is DVD #5 a current release (Y/N)? y
DVD #6 is free!
The total is $12.00