1. การเปรียบเทียบลูป: forเทียบกับwhile

สามารถใช้ ลูwhileปได้ทุกที่ที่คำสั่งหรือกลุ่มของคำสั่งต้องดำเนินการหลายครั้ง แต่ในสถานการณ์ที่เป็นไปได้ทั้งหมด สิ่งหนึ่งที่ควรค่าแก่การเน้นย้ำ

เรากำลังพูดถึงสถานการณ์ที่โปรแกรมเมอร์ (ผู้สร้างโปรแกรม) รู้ล่วงหน้าว่าควรดำเนินการลูปกี่ครั้ง โดยปกติจะจัดการโดยการประกาศตัวแปรตัวนับพิเศษ จากนั้นเพิ่ม (หรือลด) ตัวแปรด้วย1การวนซ้ำแต่ละครั้ง

ทุกอย่างดูเหมือนจะทำงานได้ตามที่ควร แต่ก็ไม่สะดวกนัก ก่อนลูป เราตั้งค่าเริ่มต้นของตัวแปรตัวนับ จากนั้นในเงื่อนไขเราจะตรวจสอบว่าถึงค่าสุดท้ายแล้วหรือไม่ แต่เรามักจะเปลี่ยนค่าที่ส่วนท้ายสุดของตัวลูป

แล้วถ้าร่างกายของลูปมีขนาดใหญ่ล่ะ? หรือถ้าเรามีลูปที่ซ้อนกันหลายอัน โดยทั่วไป ในกรณีเหล่านี้ ขอแนะนำให้รวบรวมข้อมูลทั้งหมดเกี่ยวกับตัวแปรตัวนับไว้ในที่เดียว และนั่นคือเหตุผลที่เรามีforลูปใน Java มันดูไม่ซับซ้อนมาก:

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

การwhileวนซ้ำจะมีเพียงเงื่อนไขในวงเล็บ แต่forการวนซ้ำจะเพิ่มสองคำสั่งโดยคั่นด้วยเครื่องหมายอัฒภาค

ความจริงนั้นง่ายกว่าที่คิด: คอมไพเลอร์แปลงforลูปเป็นลูปธรรมดาwhileดังนี้:

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

หรือดีกว่านั้น เรามาสาธิตสิ่งนี้ด้วยตัวอย่างกันดีกว่า ข้อมูลโค้ดสองตัวด้านล่างเหมือนกัน

ตัวเลือกที่ 1 ตัวเลือก 2
for (int i = 0; i < 20; i++)
{
   System.out.println(i);
}
int i = 0;
while (i < 20)
{
   System.out.println(i);
   i++;
}

เราเพิ่งรวบรวมรหัสทั้งหมดที่เกี่ยวข้องกับiตัวแปรตัวนับ ไว้ในที่เดียว

ในforลูปคำสั่ง 1จะถูกดำเนินการเพียงครั้งเดียว ก่อนที่ลูปจะเริ่มต้นเอง สิ่งนี้สามารถเห็นได้อย่างชัดเจนในข้อมูลโค้ดที่สอง

คำสั่ง 2จะถูกดำเนินการในจำนวนครั้งเท่ากันกับเนื้อหาของลูป และแต่ละครั้งจะถูกดำเนินการหลังจากดำเนินการเนื้อหาทั้งหมดของลูปแล้ว


2. ตำแหน่งที่forใช้ลูป

ลูforปน่าจะเป็นประเภทลูปที่ใช้มากที่สุดใน Java มันถูกใช้ทุกที่สำหรับโปรแกรมเมอร์มันชัดเจนและสะดวกกว่าwhileการวนซ้ำ แทบทุกwhileลูปสามารถแปลงเป็นforลูปได้

ตัวอย่าง:

ในขณะที่วนซ้ำ สำหรับลูป
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;
}

ให้ความสนใจกับตัวอย่างสุดท้าย ไม่มีคำสั่งสำหรับการทำงานกับตัวนับลูป ไม่มีเคาน์เตอร์และไม่มีใบแจ้งยอด

ในforลูป Java ให้คุณละเว้น "คำสั่งเพื่อเริ่มต้นตัวนับ" และ "คำสั่งเพื่ออัปเดตตัวนับ" แม้แต่นิพจน์ที่กำหนดเงื่อนไขการวนซ้ำก็สามารถละเว้นได้



3. ความแตกต่างของการใช้forลูป

จุดสำคัญเกี่ยวกับการใช้forลูปbreakและcontinueคำสั่ง

คำbreakสั่งในforลูปทำงานเหมือนกับในwhileลูป — มันจะยุติการวนซ้ำทันที คำcontinueสั่งข้ามเนื้อหาของลูป แต่ไม่ใช่statement 2(ซึ่งเปลี่ยนตัวนับลูป)

ลองมาดูกันว่า ลูป forและwhileลูปเกี่ยวข้องกัน อย่างไร

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

หากcontinueคำสั่งถูกดำเนินการในforลูปส่วนที่เหลือของบล็อกคำสั่งจะถูกข้าม แต่คำสั่ง 2 (คำสั่งที่ทำงานกับforตัวแปรตัวนับของลูป) จะยังคงดำเนินการอยู่

กลับไปที่ตัวอย่างของเราโดยข้ามตัวเลขที่หารด้วย 7 ลงตัว

รหัสนี้จะวนซ้ำตลอดไป รหัสนี้จะทำงานได้ดี
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);
}

รหัสที่ใช้whileการวนซ้ำจะไม่ทำงาน — ฉันจะไม่มีวันมากกว่า 7 แต่รหัสที่มีforการวนซ้ำจะทำงานได้ดี



4. การเปรียบเทียบลูป: Java กับ Pascal

อย่างไรก็ตาม Pascal ก็มีForลูป เช่นกัน โดยทั่วไปแล้ว ภาษาโปรแกรมทุกภาษาจะมีหนึ่งภาษา แต่ในภาษาปาสคาลนั้นชัดเจนมาก ตัวอย่าง:

ปาสคาล ชวา
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);
}