Hãy xem xét trường hợp chúng ta muốn hiển thị cho người dùng menu và yêu cầu họ thực hiện lựa chọn – và nếu người dùng chọn một lựa chọn không hợp lệ, hãy hỏi lại họ. Rõ ràng menu và lựa chọn phải đi vào bên trong một vòng lặp nào đó (vì vậy chúng ta có thể tiếp tục hỏi người dùng cho đến khi họ nhập đầu vào hợp lệ), nhưng chúng ta nên chọn loại vòng lặp nào?

Vì vòng lặp while đánh giá điều kiện từ trước, đó là một lựa chọn khó xử. Chúng ta có thể giải quyết vấn đề 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
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

#include <iostream>
 
int main()
{
    // selection must be declared outside while loop so we can use it later
    int selection{ 0 };
 
    while (selection != 1 && selection != 2 &&
        selection != 3 && selection != 4)
    {
        std::cout << "Please make a selection: \n";
        std::cout << "1) Addition\n";
        std::cout << "2) Subtraction\n";
        std::cout << "3) Multiplication\n";
        std::cout << "4) Division\n";
        std::cin >> selection;
    }
 
    // do something with selection here
    // such as a switch statement
 
    std::cout << "You selected option #" << selection << "\n";
 
    return 0;
}

Nhưng điều này chỉ hoạt động vì giá trị ban đầu của chúng tôi là 0 để lựa chọn không nằm trong tập hợp các giá trị hợp lệ (1, 2, 3 hoặc 4). Điều gì sẽ xảy ra nếu 0 là một lựa chọn hợp lệ? Chúng ta sẽ phải chọn một trình khởi tạo khác để thể hiện “không hợp lệ” – và bây giờ chúng ta đang đưa các số ma thuật (4,12 – Chữ ký tự) vào code của mình.

Thay vào đó, chúng ta có thể thêm một biến mới để theo dõi tính hợp lệ, như sau:

#include <iostream>
 
int main()
{
    int selection { 0 };
    bool invalid { true }; // new variable just to gate the loop
 
    while (invalid)
    {
        std::cout << "Please make a selection: \n";
        std::cout << "1) Addition\n";
        std::cout << "2) Subtraction\n";
        std::cout << "3) Multiplication\n";
        std::cout << "4) Division\n";
 
        std::cin >> selection;
        invalid = (selection != 1 && selection != 2 &&
            selection != 3 && selection != 4)
    }
 
    // do something with selection here
    // such as a switch statement
 
    std::cout << "You selected option #" << selection << "\n";
 
    return 0;
}

Mặc dù điều này tránh được số ma thuật, nhưng nó giới thiệu một biến mới chỉ để đảm bảo vòng lặp chạy một lần, và điều đó làm tăng thêm độ phức tạp và khả năng xảy ra lỗi.

1. Câu lệnh do while

Để giúp giải quyết các vấn đề như trên, C ++ cung cấp câu lệnh do-while:

do
    Câu lệnh
while (điều kiện);

Câu lệnh do while là một cấu trúc lặp hoạt động giống như vòng lặp while, ngoại trừ câu lệnh luôn thực thi ít nhất một lần. Sau khi câu lệnh đã được thực thi, vòng lặp do-while sẽ kiểm tra điều kiện. Nếu điều kiện được đánh giá là true, đường dẫn thực thi sẽ nhảy trở lại đầu vòng lặp do-while và thực thi lại.

Đây là ví dụ của chúng ta ở trên sử dụng vòng lặp do-while thay vì vòng lặp while:

#include <iostream>
 
int main()
{
    // selection must be declared outside of the do-while so we can use it later
    int selection{};
 
    do
    {
        std::cout << "Please make a selection: \n";
        std::cout << "1) Addition\n";
        std::cout << "2) Subtraction\n";
        std::cout << "3) Multiplication\n";
        std::cout << "4) Division\n";
        std::cin >> selection;
    }
    while (selection != 1 && selection != 2 &&
        selection != 3 && selection != 4);
 
    // do something with selection here
    // such as a switch statement
 
    std::cout << "You selected option #" << selection << "\n";
 
    return 0;
}

Bằng cách này, chúng ta đã tránh được cả số ma thuật và các biến bổ sung.

Một điều đáng bàn trong ví dụ trên là biến lựa chọn phải được khai báo bên ngoài khối do. Nếu biến lựa chọn được khai báo bên trong khối do, nó sẽ bị hủy khi khối do kết thúc, điều này xảy ra trước khi điều kiện được đánh giá. Nhưng chúng ta cần biến trong điều kiện while – do đó, biến lựa chọn phải được khai báo bên ngoài khối do (ngay cả khi sau này nó không được sử dụng trong phần thân của hàm).

Trong thực tế, vòng lặp do-while không được sử dụng phổ biến. Có điều kiện ở cuối vòng lặp che khuất điều kiện vòng lặp, điều này có thể dẫn đến lỗi. Do đó, nhiều developer khuyên bạn nên tránh hoàn toàn các vòng lặp do-while. Chúng ta sẽ có lập trường mềm mỏng hơn và ủng hộ việc ưu tiên while lặp lại do-while khi được lựa chọn bình đẳng.

Bạn nên – Ủng hộ lặp lại while hơn  do-while khi được lựa chọn như nhau.

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

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!