1. Lệnh goto trong C++
Câu lệnh goto
trong C++ còn được gọi là câu lệnh nhảy. Lệnh goto
được sử dụng để chuyển điều khiển sang phần khác của chương trình. Lệnh goto
trong C++ nhảy đến nhãn được chỉ định.
Ví dụ như chương trình đang chạy đến ở dòng 300, chương trình gặp lệnh goto A (A là nhãn), nó sẽ nhãy lến dòng có nhãn là A và thực thi đoạn code ở đó.
Cú pháp
Cú pháp của lệnh goto
trong C++ như sau:
1
2
3
4
5
|
goto label; . . . label: statement; |
Hoặc
1
2
3
4
5
|
label: statement; . . . goto label; |
Trong đó:
- label: là nhãn do người lập trình định nghĩa, khi gặp lệnh
goto label
chương trình sẽ điều khiển đến label đó và thực thi đoạn code đó - statement: là các câu lệnh sẽ được thực thi
Lưu đồ hoạt động
Lưu đồ hoạt động của lệnh goto
trong C++ như sau:
2. Ví dụ lệnh goto trong C++
Sau đây mình sẽ lấy một ví dụ đơn giản có sử dụng lệnh goto
trong C++ đó là yêu cầu người dùng nhập một tuổi hợp lệ. (Tuổi hợp lệ là tuối phải lớn hơn 0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <iostream> using namespace std; int main() { TuoiHopLe: cout << "Nhap lai tuoi cua ban: " << endl; cout << "Tuoi ban la: " ; int tuoi; cin >> tuoi; if (tuoi < 1){ goto TuoiHopLe; } else { cout << "Ban da nhap tuoi hop le" << endl; } } |
Và kết quả sau khi chạy và thực hiện đoạn code trên như sau:
Mình xin giải thích luồng chạy của chương trình trên như sau:
Giả sử mình sẽ đánh số thứ tự các dòng của dòng code trên như dưới đây:
#include <iostream>
using namespace std;
int main()
{
1 TuoiHopLe:
2 cout << “Nhap lai tuoi cua ban: ” << endl;
3 cout << “Tuoi ban la: “;
4 int tuoi;
5 cin >> tuoi;
6 if (tuoi < 1) {
7 goto TuoiHopLe;
}
else
{
8 cout << “Ban da nhap tuoi hop le” << endl;
}
}
Nếu một chương trình bình thường sẽ chạy theo thứ tự từ dòng 1 đến dòng cuối cùng và kết thúc chương trình. Chương trình không thể nào quay lại dòng trước để thực thi một lần nữa. Nhưng đối với chương trình có sử dụng goto
thì cho phép chương trình quay lại dòng trước để thực thi tiếp.
Quay lại ví dụ trên, chương trình gọi tới hàm main sẽ chạy từ dòng 1, 2, 3, 4, 5, đến dòng 6 kiểm tra điều kiện nếu đúng thì chạy đến dòng 7, ở dòng 7 này có lệnh goto
có nhãn là TuoiHopLe, chương trình sẽ tìm dòng có nhãn là TuoiHopLe để chạy, ở ví dụ trên nhãn TuoiHopLe ở dòng 1 vì vậy chương trình quay lại dòng 1 để chạy rồi tiếp tục dòng 2, 3, 4, 5, đến dòng 6 lại kiếm tra điều kiện nếu đúng thì đến dòng 7 và tiếp tục trở về dòng 1, nếu điều kiện sai thì chạy xuống dòng 8 và kết thúc chương trình.
Tuy nhiên các bạn nên hạn chế sử dụng lệnh goto
trong chương trình của mình. Chỉ nên sử dụng lệnh goto
trong một số trường hợp đặc biệt bắt buộc phải sử dụng mà thôi.
Lý do mà mình khuyên các bạn hạn chế sử dụng lệnh goto
trong chương trình của mình là vì những điểm bất lợi của lệnh goto
trong C++ như sau:
- nó làm cho logic chương trình rất phức tạp
- sử dụng lệnh goto rất khó để bảo trì, sử dụng nhiều lệnh goto trong một chương trình là một cơn ác mộng đối với người chịu trách nhiệm bào trì chương trình.
- có thể sử dụng các câu lệnh break và continue để tránh sử dụng lệnh goto
- chương trình rất dể bị vô vòng lặp vô hạn
Mình có thể giải quyết ví dụ trên bằng vòng lặp do while
và lệnh break
trong C++ mà không cần dùng đến lệnh goto
như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <iostream> using namespace std; int main() { int tuoi; do { cout << "Nhap lai tuoi cua ban: " << endl; cout << "Tuoi ban la: " ; cin >> tuoi; if (tuoi < 1){ } else { cout << "Ban da nhap tuoi hop le" << endl; break ; } } while (tuoi < 1); } |
3. Kết luận
Như vậy là chúng ta đã tìm hiểu xong lệnh goto
trong C++ là gì rồi. Trong bài học này các bạn chỉ cần biết cách sử dụng của lệnh goto
là như thế nào thôi, mình không khuyến khích các bạn sử dụng lệnh goto
để giải quyết vấn đề nhé, chỉ thật sự sử dụng lệnh goto
trong một số trường hợp đặc biệt bắt buộc phải sử dụng lênh goto
thôi nhé. Mà trường hợp đặc biệt đó là gì thì mình cũng chưa biết vì đó giờ mình cũng chưa từng sử dụng lệnh goto
trong chương trình của mình. 🙂
Nguồn: https://freetuts.net
1 Bình luận của bạn đọc
Thêm bình luận
Bạn phải đăng nhập để gửi phản hồi.
I wanted to thank you for this good read!! I absolutely loved every bit of
it. I have got you bookmarked to check out new stuff
you post…