[Tự học C++] Break và continue trong C++ » Cafedev.vn

1. Break

Mặc dù bạn đã thấy câu lệnh break trong bài câu lệnh switch nhưng nó nên được hiểu đầy đủ hơn vì nó cũng có thể được sử dụng với các loại vòng lặp khác. Câu lệnh break khiến câu lệnh for, switch hoặc while kết thúc.

2. Breaking trong switch

Trong ngữ cảnh của một câu lệnh switch, một dấu ngắt thường được sử dụng vào cuối mỗi case để biểu thị case đã kết thúc (điều này ngăn chặn sự lướt qua hết các case):

/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: [email protected]
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

switch (ch)
{
    case '+':
        doAddition(x, y);
        break;
    case '-':
        doSubtraction(x, y);
        break;
    case '*':
        doMultiplication(x, y);
        break;
    case '/':
        doDivision(x, y);
        break;
}

3. Breaking trong vòng lặp

Trong ngữ cảnh của một vòng lặp, một câu lệnh break có thể được sử dụng để khiến vòng lặp kết thúc sớm:

/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: [email protected]
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

#include <iostream>
 
int main()
{
    int sum{ 0 };
 
    // Allow the user to enter up to 10 numbers
    for (int count{ 0 }; count < 10; ++count)
    {
        std::cout << "Enter a number to add, or 0 to exit: ";
        int num{};
        std::cin >> num;
 
        // exit loop if user enters 0
        if (num == 0)
            break;
 
        // otherwise add number to our sum
        sum += num;
    }
 
    std::cout << "The sum of all the numbers you entered is " << sum << "\n";
 
    return 0;
}

Chương trình này cho phép người dùng nhập tối đa 10 số và hiển thị tổng của tất cả các số được nhập ở cuối. Nếu người dùng nhập 0, break sẽ khiến vòng lặp kết thúc sớm (trước khi nhập 10 số).

Lưu ý rằng break có thể được sử dụng để thoát khỏi một vòng lặp vô hạn:

#include <iostream>
 
int main()
{
    while (true) // infinite loop
    {
        std::cout << "Enter 0 to exit or anything else to continue: ";
        int num{};
        std::cin >> num;
 
        // exit loop if user enters 0
        if (num == 0)
            break;
    }
 
    std::cout << "We're out!\n";
 
    return 0;
}

4. Break vs return

Các lập trình viên mới thường gặp khó khăn trong việc hiểu sự khác biệt giữa break và return. Một câu lệnh break chấm dứt công việc hoặc vòng lặp và việc thực thi sẽ tiếp tục ở câu lệnh đầu tiên ngoài công việc hoặc một vòng lặp đó. Một câu lệnh return kết thúc toàn bộ hàm mà vòng lặp nằm trong và việc thực thi tiếp tục tại điểm mà hàm được gọi.

/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: [email protected]
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

#include <iostream>
 
int breakOrReturn()
{
    while (true) // infinite loop
    {
        std::cout << "Enter 'b' to break or 'r' to return: ";
        char ch;
        std::cin >> ch;
 
        if (ch == 'b')
            break; // execution will continue at the first statement beyond the loop
 
        if (ch == 'r')
            return 1; // return will cause the function to immediately return to the caller (in this case, main())
    }
 
    // breaking the loop causes execution to resume here
 
    std::cout << "We broke out of the loop\n";
 
    return 0;
}
 
int main()
{
    int returnValue{ breakOrReturn() };
    std::cout << "Function breakOrReturn returned " << returnValue << '\n';
 
    return 0;
}

5. Continue

Câu lệnh continue cung cấp một cách thuận tiện để nhảy đến cuối thân vòng lặp cho lần lặp hiện tại. Điều này rất hữu ích khi chúng ta muốn chấm dứt sớm việc lặp lại hiện tại.

Dưới đây, một ví dụ về việc sử dụng tiếp tục:

for (int count{ 0 }; count  < 20; ++count)
{
    // if the number is divisible by 4, skip this iteration
    if ((count % 4) == 0)
        continue; // jump to end of loop body
 
    // If the number is not divisible by 4, keep going
    std::cout << count << std::endl;
 
    // The continue statement jumps to here
}

Chương trình này in tất cả các số từ 0 đến 19 mà count chia hết cho 4.

Trong trường hợp vòng lặp for, câu lệnh kết thúc của vòng lặp for vẫn thực thi sau khi tiếp tục (vì điều này xảy ra sau khi kết thúc thân vòng lặp).

Hãy cẩn thận khi sử dụng câu lệnh continue với các vòng lặp while hoặc do-while. Bởi vì các vòng lặp này thường làm tăng các biến vòng lặp trong phần thân của vòng lặp, sử dụng continue có thể khiến vòng lặp trở nên vô hạn! Hãy xem xét chương trình sau:

int count{ 0 };
while (count < 10)
{
    if (count == 5)
        continue; // jump to end of loop body
 
    std::cout << count << ' ';
 
    ++count; // this statement is never executed after count reaches 5
 
    // The continue statement jumps to here
}

Chương trình này dự định in mọi số từ 0 đến 9 trừ 5. Nhưng thực tế nó in:

0 1 2 3 4

và sau đó đi vào một vòng lặp vô hạn. Khi đếm là 5, câu lệnh if ước tính là true và vòng lặp nhảy xuống dưới cùng. Biến đếm không bao giờ tăng. Do đó, ở lần tiếp theo, số đếm vẫn là 5, câu lệnh if vẫn đúng và chương trình tiếp tục lặp lại mãi mãi.

Dưới đây, một ví dụ với vòng lặp do-while sử dụng continue chính xác:

int count{ 0 };
do
{
    if (count == 5)
        continue; // jump to end of loop body
    std::cout << count << ' ';
 
    // The continue statement jumps to here
} while (++count < 10); // this still executes since it's outside the loop body
0 1 2 3 4 6 7 8 9

6. Sử dụng break và continue

Nhiều sách giáo khoa khuyến cáo độc giả không nên sử dụng break và continue, vì cả 2 điều khiến luồng thực thi nhảy xung quanh và vì nó có thể làm cho luồng logic khó theo dõi hơn. Ví dụ, một break ở giữa một đoạn logic phức tạp có thể bị bỏ sót hoặc có thể không rõ ràng trong những điều kiện nào nên được kích hoạt.

Tuy nhiên, được sử dụng một cách thận trọng, break và continue có thể giúp làm cho các vòng lặp dễ đọc hơn bằng cách giữ số lượng các khối lồng nhau xuống và giảm nhu cầu logic lặp phức tạp.

Ví dụ, hãy xem xét chương trình sau:

/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: [email protected]
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

#include <iostream>
 
int main()
{
    int count{ 0 }; // count how many times the loop iterates
    bool keepLooping { true }; // controls whether the loop ends or not
    while (keepLooping)
    {
        std::cout << "Enter 'e' to exit this loop or any other character to continue: ";
        char ch{};
        std::cin >> ch;
 
        if (ch == 'e')
            keepLooping = false;
        else
        {
            ++count;
            std::cout << "We've iterated " << count << " times\n";
        }
    }
 
    return 0;
}

Chương trình này sử dụng biến boolean để kiểm soát vòng lặp có tiếp tục hay không, cũng như một khối lồng nhau chỉ chạy nếu người dùng không thoát ra.

Ở đây, một phiên bản mà dễ hiểu hơn, sử dụng câu lệnh break:

/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: [email protected]
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

#include <iostream>
 
int main()
{
    int count{ 0 }; // count how many times the loop iterates
    while (true) // loop until user terminates
    {
        std::cout << "Enter 'e' to exit this loop or any other character to continue: ";
        char ch;
        std::cin >> ch;
 
        if (ch == 'e')
            break;
 
        ++count;
        std::cout << "We've iterated " << count << " times\n";
    }
 
    return 0;
}

Trong phiên bản này, bằng cách sử dụng một câu lệnh ngắt đơn, chúng ta đã tránh sử dụng biến boolean (và phải hiểu cả mục đích sử dụng của nó là gì và nơi nó được đặt), một câu lệnh khác và một khối lồng nhau.

Giảm thiểu số lượng biến được sử dụng và giữ số lượng các khối lồng nhau xuống giúp cải thiện khả năng hiểu code hơn là break hoặc continue gây hại cho nó. Vì lý do đó, chúng tôi tin rằng việc sử dụng hợp lý break hoặc continue là chấp nhận được.

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!