1. So sánh vòng lặp: forvswhile

Một whilevòng lặp có thể được sử dụng ở bất cứ đâu mà một câu lệnh hoặc một nhóm câu lệnh cần được thực hiện nhiều lần. Nhưng trong số tất cả các tình huống có thể xảy ra, có một tình huống đáng chú ý.

Chúng ta đang nói về tình huống khi lập trình viên (người tạo chương trình) biết trước vòng lặp sẽ được thực hiện bao nhiêu lần. Điều này thường được xử lý bằng cách khai báo một biến đếm đặc biệt, sau đó tăng (hoặc giảm) biến đó theo 1mỗi lần lặp của vòng lặp.

Mọi thứ dường như hoạt động như bình thường, nhưng nó không thuận tiện lắm. Trước vòng lặp, chúng ta đặt giá trị ban đầu của biến đếm. Sau đó, trong điều kiện, chúng tôi kiểm tra xem nó đã đạt đến giá trị cuối cùng chưa. Nhưng chúng ta thường thay đổi giá trị ở cuối thân vòng lặp.

Và nếu phần thân của vòng lặp lớn thì sao? Hoặc nếu chúng ta có một số vòng lặp lồng nhau? Nói chung, trong những trường hợp này, nên thu thập tất cả thông tin này về các biến bộ đếm ở một nơi. Và đó là lý do tại sao chúng ta có forvòng lặp trong Java. Nó cũng không có vẻ phức tạp lắm:

for (statement 1; condition; statement 2)
{
   block of statements
}

Một whilevòng lặp chỉ có một điều kiện trong ngoặc đơn, nhưng một forvòng lặp thêm hai câu lệnh, được phân tách bằng dấu chấm phẩy.

Thực tế đơn giản hơn ta tưởng: trình biên dịch chuyển đổi một forvòng lặp thành một whilevòng lặp thông thường như sau:

statement 1;
while (condition)
{
   block of statements
   statement 2;
}

Hoặc tốt hơn, hãy chứng minh điều này bằng một ví dụ. Hai đoạn mã dưới đây giống hệt nhau.

lựa chọn 1 Lựa chọn 2
for (int i = 0; i < 20; i++)
{
   System.out.println(i);
}
int i = 0;
while (i < 20)
{
   System.out.println(i);
   i++;
}

Chúng tôi chỉ tập hợp vào một nơi tất cả các mã liên quan đến ibiến đếm.

Trong một forvòng lặp, câu lệnh 1 chỉ được thực hiện một lần trước khi vòng lặp bắt đầu. Điều này có thể được nhìn thấy rõ ràng trong đoạn mã thứ hai

câu lệnh 2 được thực thi cùng số lần với phần thân của vòng lặp và mỗi lần nó được thực hiện sau khi toàn bộ phần thân của vòng lặp đã được thực thi


2. Trường hợp forsử dụng vòng lặp

Vòng forlặp có lẽ là loại vòng lặp được sử dụng nhiều nhất trong Java. Nó được sử dụng ở mọi nơi, đối với các lập trình viên, nó rõ ràng và thuận tiện hơn một whilevòng lặp. Hầu như bất kỳ whilevòng lặp nào cũng có thể được chuyển đổi thành một forvòng lặp.

Ví dụ:

trong khi lặp lại cho vòng lặp
int i = 3;
while (i >= 0)
{
   System.out.println(i);
   i--;
}
for (int i = 3; i >= 0; i--)
{
   System.out.println(i);
}
int i = 0;
while (i < 3)
{
   System.out.println(i);
   i++;
}
for (int i = 0; i < 3; i++)
{
   System.out.println(i);
}
boolean isExit = false;
while (!isExit)
{
   String s = console.nextLine();
   isExit = s.equals("exit");
}
for (boolean isExit = false; !isExit; )
{
   String s = console.nextLine();
   isExit = s.equals("exit");
}
while (true)
   System.out.println("C");
for (; true; )
   System.out.println("C");
while (true)
{
   String s = console.nextLine();
   if (s.equals("exit"))
      break;
}
for (; true; )
{
   String s = console.nextLine();
   if (s.equals("exit"))
      break;
}

Hãy chú ý đến ví dụ cuối cùng. Các câu lệnh để làm việc với bộ đếm vòng lặp bị thiếu. Không có truy cập và không có tuyên bố.

Trong một forvòng lặp, Java cho phép bạn bỏ qua "câu lệnh khởi tạo bộ đếm" và "câu lệnh cập nhật bộ đếm". Ngay cả biểu thức xác định điều kiện vòng lặp cũng có thể được bỏ qua.



3. Các sắc thái của việc sử dụng forvòng lặp

Một điểm quan trọng về việc sử dụng forvòng lặp breakcontinuecâu lệnh.

Một breakcâu lệnh trong một forvòng lặp hoạt động giống như trong một whilevòng lặp — nó kết thúc vòng lặp ngay lập tức. Một continuecâu lệnh bỏ qua thân vòng lặp, nhưng không statement 2(làm thay đổi bộ đếm vòng lặp).

Chúng ta hãy xem xét lại cách thức forwhilecác vòng lặp có liên quan với nhau.

for (statement 1; condition; statement 2)
{
   block of statements
}
statement 1;
while (condition)
{
   block of statements
   statement 2;
}

Nếu một continuecâu lệnh được thực thi trong một forvòng lặp , thì phần còn lại của khối câu lệnh sẽ bị bỏ qua, nhưng câu lệnh 2 (câu lệnh hoạt động với forbiến đếm của vòng lặp) vẫn được thực thi.

Hãy quay lại ví dụ của chúng ta với việc bỏ qua các số chia hết cho 7.

Mã này sẽ lặp mãi mãi Mã này sẽ hoạt động tốt
int i = 1;
while (i <= 20)
{
   if ( (i % 7) == 0) continue;
   System.out.println(i);
   i++;
}
for (int i = 1; i <= 20; i++)
{
   if ( (i % 7) == 0) continue;
   System.out.println(i);
}

Mã sử ​​dụng whilevòng lặp sẽ không hoạt động — i sẽ không bao giờ lớn hơn 7. Nhưng mã có vòng forlặp sẽ hoạt động tốt.



4. So sánh vòng lặp for: Java vs Pascal

Nhân tiện, Pascal cũng có một Forvòng lặp. Nói chung, về cơ bản mọi ngôn ngữ lập trình đều có một. Nhưng trong Pascal thì nó siêu rõ ràng. Ví dụ:

pascal Java
For i := 1 to 10 do
Begin
   Writeln(i);
End;
for (int i = 1; i <= 10; i++)
{
   System.out.println(i);
}
For i := 1 to 10 do step 2
Begin
   Writeln(i);
End;
for (int i = 1; i <= 10; i = i + 2)
{
   System.out.println(i);
}
For i := 10 downto 0 do step 2
Begin
   Writeln(i);
End;
for (int i = 10; i >= 0; i = i - 2)
{
   System.out.println(i);
}