Khi một chương trình được chạy, CPU bắt đầu thực thi ở đầu hàm main(), thực thi một số câu lệnh và sau đó kết thúc ở cuối hàm main(). Chuỗi các câu lệnh mà CPU thực thi được gọi là đường dẫn thực thi của chương trình (hay gọi tắt là đường dẫn). Hầu hết các chương trình bạn đã thấy cho đến nay là các chương trình thực thi theo kiểu đường thẳng. Các chương trình đường thẳng có luồng thực thi một cách tuần tự – nghĩa là chúng có cùng một đường dẫn thực thi (thực hiện cùng một câu lệnh) mỗi khi chúng được chạy (ngay cả khi đầu vào của người dùng thay đổi).

Tuy nhiên, thường thì đây không phải là điều chúng ta mong muốn. Ví dụ: nếu chúng ta yêu cầu người dùng thực hiện lựa chọn và người dùng nhập một lựa chọn không hợp lệ, lý tưởng nhất là chúng ta muốn yêu cầu người dùng đưa ra lựa chọn khác. Điều này sẽ không xảy ra trong một chương trình đường thẳng. Ngoài ra, có những trường hợp chúng ta cần phải làm một số lần, nhưng chúng ta không biết bao nhiêu lần vào thời gian biên dịch. Ví dụ: nếu chúng ta muốn in tất cả các số nguyên từ 0 đến một số số người dùng đã nhập, chúng tôi không thể làm điều đó cho đến khi chúng tôi biết số người dùng đã nhập.

May mắn thay, C ++ cung cấp các câu lệnh điều khiển luồng(control flow statements) (còn gọi là câu lệnh control flow), cho phép lập trình viên thay đổi đường dẫn thực thi của CPU thông qua chương trình. Có khá nhiều loại câu lệnh điều khiển luồng khác nhau, vì vậy chúng ta sẽ đề cập ngắn gọn về chúng ở đây, và sau đó chi tiết hơn trong suốt phần còn lại của phần.

1. Lệnh Tạm dừng lại

Câu lệnh điều khiển cơ bản nhất là tạm dừng , thông báo cho chương trình bỏ chạy ngay lập tức. Trong C++, việc tạm dừng có thể được thực hiện thông qua việc sử dụng hàm std::exit() được định nghĩa trong header cstdlib. Hàm std::exit lấy một tham số nguyên được trả về hệ điều hành dưới dạng std::exit, giống như giá trị trả về của hàm main().

Đây là một ví dụ về việc sử dụng std::exit():

/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: cafedevn@gmail.com
* 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 <cstdlib> // needed for exit()
#include <iostream>
 
void cleanup()
{
    // code here to do any kind of cleanup required
}
 
int main()
{
    std::cout << 1;
    cleanup();
 
    exit(0); // terminate and return 0 to operating system
 
    // The following statements never execute
    std::cout << 2;
    return 0;
}

Lưu ý rằng std::exit() hoạt động bất kể nó được gọi từ bất kỳ hàm nào (thậm chí là một cho hàm khác ngoài hàm main). Cũng lưu ý rằng std::exit() chấm dứt chương trình ngay lập tức và nó không giải phóng hết tất cả bộ nhớ của chương trình. Do đó, trước khi gọi std::exit(), bạn nên xem xét liệu có cần dọn dẹp thủ công không để chắc rằng chương trình sẽ được dọn sạch(giải phóng sạch sẽ).

Thông thường, std::exit() được sử dụng để kết thúc chương trình ngay lập tức khi xảy ra một số lỗi nghiêm trọng, không thể phục hồi.

2. Lệnh nhảy

Câu lệnh kiểm soát luồng hoạt động của chương trình cơ bản nhất tiếp theo là các bước nhảy. Một bước nhảy vô điều kiện khiến CPU nhảy sang một câu lệnh khác. Các từ khóa goto , breakcontinue đều gây ra các kiểu nhảy khác nhau – chúng ta sẽ thảo luận về sự khác biệt giữa các từ khóa này trong các phần sắp tới.

Các cuộc gọi hàm cũng gây ra hành vi giống như nhảy. Khi một lệnh gọi hàm được thực thi, CPU sẽ nhảy lên đỉnh của hàm được gọi. Khi hàm được gọi kết thúc, thực thi trở lại câu lệnh sau khi gọi hàm.

3. Câu lệnh rẻ nhánh có điều kiện

Rẻ Nhánh có điều kiện là một câu lệnh làm cho chương trình thay đổi đường dẫn thực hiện dựa trên giá trị của biểu thức. Nhánh có điều kiện cơ bản nhất là một câu lệnh if , mà bạn đã thấy trong các ví dụ trước. 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: cafedevn@gmail.com
* 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/
*/

int main()
{
    // do A
    if (expression)
        // do B
    else
        // do C
 
    // do D
}

Chương trình này có hai con đường có thể thực thi. Nếu expression(Biểu thức) ước lượng là true, chương trình sẽ thực thi A, B và D. Nếu expression ước lượng thành false, chương trình sẽ thực thi A, C và D. Như bạn có thể thấy, chương trình này không còn là chương trình đường thẳng mà đường dẫn thực hiện của nó phụ thuộc vào giá trị của expression.

Từ khóa switch cũng cung cấp một cơ chế để thực hiện phân nhánh có điều kiện. Chúng ta sẽ đề cập đến switch và câu lệnh switch chi tiết hơn trong phần sắp tới.

4. Vòng lặp

Một vòng lặp làm cho chương trình liên tục thực thi một loạt các câu lệnh cho đến khi một điều kiện nhất định là sai. Ví dụ:

int main()
{
    // do A
    // loop on B, 0 or more times
    // do C
}

Chương trình này có thể thực thi như ABC, ABBC, ABBBC, ABBBBC hoặc thậm chí AC. Một lần nữa, bạn có thể thấy rằng chương trình này không còn là chương trình đường thẳng nữa – đường dẫn thực hiện của nó phụ thuộc vào số lần (nếu có) mà phần lặp được thực thi.

C++ cung cấp 3 loại vòng lặp: while , do while và for cho các vòng lặp. C++ 11 đã thêm hỗ trợ cho một loại vòng lặp mới gọi là for each. Chúng ta sẽ thảo luận về các vòng lặp đến cuối chương này, ngoại trừ for each, chúng ta sẽ thảo luận một lát sau.

5. Ngoại lệ(Exceptions)

Cuối cùng, các ngoại lệ(Exceptions) cung cấp một cơ chế xử lý các lỗi xảy ra trong một hàm. Nếu xảy ra lỗi trong một hàm mà hàm không thể xử lý, hàm có thể kích hoạt một ngoại lệ. Điều này khiến CPU nhảy đến khối code gần nhất xử lý các ngoại lệ của loại đó.

Xử lý ngoại lệ là một tính năng khá tiên tiến của C++.

6. Phần kết luận

Sử dụng các câu lệnh điều khiển luồng của chương trình, bạn có thể ảnh hưởng đến đường dẫn CPU đi qua chương trình và điều khiển trong những điều kiện mà nó sẽ chấm dứt.

Khi bạn hiểu luồng chương trình, những điều bạn có thể làm với chương trình C ++ thực sự mở ra. Bạn sẽ không còn bị giới hạn trong các chương trình đồ chơi và bài tập học thuật – bạn sẽ có thể viết các chương trình với ứng dụng thực sự. Đây là nơi niềm vui thực sự bắt đầu. Vì vậy, hay thực hiện ngay bây giơ!

Tổng hợp các tài liệu về control flow trong C/C++

1Câu lệnh If trong C++
2Giới thiệu về Switch trong C++
3Câu lệnh Goto trong C++
4Câu lệnh While trong C++
5Câu lệnh For trong C++
6Break và continue trong C++

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

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