Câu lệnh goto là một câu lệnh điều khiển luồng làm cho CPU nhảy đến một điểm khác trong code. Điểm này được xác định thông qua việc sử dụng một tên nhãn. Sau đây là một ví dụ về câu lệnh goto và nhãn câu lệnh:

#include <iostream>
#include <cmath> // for sqrt() function
 
int main()
{
    double x;
tryAgain: // this is a statement label
    std::cout << "Enter a non-negative number"; 
    std::cin >> x;
 
    if (x < 0.0)
        goto tryAgain; // this is the goto statement
 
    std::cout << "The sqrt of " << x << " is " << sqrt(x) << std::endl;
    return 0;
}

Trong chương trình này, người dùng được yêu cầu nhập số không âm. Tuy nhiên, nếu nhập số âm, chương trình sẽ sử dụng câu lệnh goto để quay lại nhãn tryAgain. Người dùng sau đó được yêu cầu nhập lại một số mới. Bằng cách này, chúng ta có thể liên tục yêu cầu người dùng nhập liệu cho đến khi họ nhập một cái gì đó hợp lệ.

Trong phần về các biến, chúng ta đã đề cập đến ba loại phạm vi: phạm vi cục bộ (khối), phạm vi trong file và phạm vi toàn cầu(toàn bộ project). Phạm vi của một nhãn là phạm vi trong một hàm. Câu lệnh goto và nhãn tương ứng của nó phải xuất hiện trong cùng một hàm.

Có một số hạn chế về việc sử dụng các câu lệnh goto. Ví dụ: bạn có thể nhảy nhảy về phía trước qua một biến mà khởi tạo trong cùng một khối với goto:

int main()
{
    goto skip; // invalid forward jump
    int x = 5;
skip:
    x += 3; // what would this even evaluate to?
    return 0;
}

Nói chung, việc sử dụng goto bị xa lánh trong C ++ (và hầu hết các ngôn ngữ cấp cao khác). Vấn đề chính với goto là nó cho phép một lập trình viên khiến điểm thực thi nhảy xung quanh code một cách tùy ý. Điều này tạo cho code của bạn rối răm và xoắn não hơn, khiến cho việc tuân theo logic của code đó trở nên vô cùng khó khăn.

Các câu lệnh goto là phổ biến trong một số ngôn ngữ cũ, chẳng hạn như Basic hoặc Fortran, và thậm chí được sử dụng trong C. Tuy nhiên, trong C++, các câu lệnh goto hầu như không bao giờ được sử dụng, vì hầu như bất kỳ code nào được viết bằng câu lệnh goto đều có thể được viết rõ ràng hơn bằng cách sử dụng các cấu trúc khác trong C++, chẳng hạn như các vòng lặp, trình xử lý ngoại lệ hoặc hàm hủy (tất cả chúng ta sẽ trình bày trong các bài học trong tương lai).

Quy tắc: Tránh sử dụng các câu lệnh goto trừ khi cần thiết

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