1. Vòng lặp vô hạn là gì?
Vòng lặp vô hạn là chuỗi câu lệnh, nhằm chỉ thị cho chương trình chạy đi chạy
lại một phần việc nào đó, sẽ kéo dài vô tận, nếu không có sự can thiệp từ bên
ngoài ("pull the plug").
Vòng lặp vô hạn có thể được triển khai có chủ
đích nhằm mang lại một tác dụng nào đó.
2. Lưu ý khi sử dụng Vòng lặp vô hạn trong lập trình:
( Rồi sẽ có ngày bạn hiểu ra vì sao tôi đưa phần lưu ý này lên trước mục 3 😏 )
Cần tránh phương án sử dụng vòng lặp vô hạn trong chương trình, hoặc hạn chế vô tình dẫn đến vòng lặp vô hạn.
Nếu vô tình dính vòng lặp vô hạn, hoặc sử dụng vòng lặp vô hạn không đúng cách, chương trình có thể bị gây treo PC hoặc bị crash (nếu trong vòng lặp khai bao biến hoặc cấp phát vùng nhớ mà không giải phóng vùng nhớ, dẫn đến memory leak).
Chỉ khi bài toán đặt ra yêu cầu 1 logic xử lý nào đó mà số vòng lặp bắt buộc không thể xác định trước được. Thì lúc này, LTV (lập trình viên) phải vận dụng vòng lặp vô hạn for(), while(), do while() một cách đúng đắn.
Từng có nhiều trường hợp chính tôi gặp trong thực tế, trong quá trình maintain code do người khác viết. Vòng lặp vô hạn khá khó kiểm soát trong trường hợp điều kiện để kết thúc vòng lặp phức tạp dần theo năm tháng ( được bổ sung dần dần bởi các yêu cầu ) -> một cách dễ dàng dẫn đến "smell code".
3. Các loại vòng lặp vô hạn
3.1. Vòng lặp vô hạn bằng goto:
ABC:
std::cout << "in ra" << std::endl;
goto ABC;
3.2. Vòng lặp vô hạn bằng while(true):
while (true) { // do something
// nhưng không có điều kiện kết thúc vòng lặp
}
#include <stdio.h>
#include <string.h>
#include <conio.h>
void main()
{
int m;
while (true) {
printf("\nNhap data m: ");
scanf("%d", &m);
if(m > 0)
{
break;
}
}
printf("\nm = %d", m);
getch();
}
3.3. Vòng lặp vô hạn với do while(true):
#include <stdio.h>
#include <string.h>
#include <conio.h>
void main()
{
int m;
do {
printf("\nNhap m: ");
scanf("%d", &m);
if(m > 0)
{
break;
}
} while(1);
printf("\nm = %d", m);
getch();
}
3.4. Vòng lặp vô hạn với for(;;):
for ( ; ; ) {
printf("\nNhap chi dan: "); gets(str);
if(strcmp(str, "quit") == 0)
{
break;
}
printf("\ns = %str", str);
}
getch();
3.5. Hàm đệ quy:
Ngoài ra còn 1 cách tạo vòng lặp vô hạn một công việc nào đó, bằng hàm đệ quy.
void functionA() {
// do something
functionA();
}
Tuy nhiên không ai làm như vậy cả, và bản chất hàm đệ quy cũng khác với các loại vòng lặp ta đã kể ở trên.
Hàm đệ quy sẽ tạo ra một call stack, và khi kết thúc hàm đươc gọi trong một hàm khác, thì hàm ở ngoài mới chính thức kết thúc.
Nếu có sử dụng hàm đệ quy, nguyên tắc cốt yếu là phải có điểm dừng cho call stack (điểm kết thúc đệ quy) , để không bị đệ quy vô tận, như dưới đây là 1 cách:
void functionA(int a) {
// do something
if(a < 1000) {
a++;
functionA(a);
} else {
// đây chính là điểm kết thúc đệ quy
}
}
TuanTiTien++