คำหลัก "ดำเนินการต่อ" คืออะไรและทำงานใน Java อย่างไร


302

ฉันเห็นคำหลักนี้เป็นครั้งแรกและฉันก็สงสัยว่ามีคนอธิบายให้ฉันได้ไหมว่ามันทำอะไร

  • อะไรคือสิ่งที่continueคำหลัก?
  • มันทำงานยังไง?
  • จะใช้เมื่อไหร่?

คำตอบ:


416

continueคำสั่งโดยไม่ต้องฉลากจะดำเนินการอีกครั้งจากสภาพด้านในสุดwhileหรือdoห่วงและจากการแสดงออกของการปรับปรุงด้านในสุดของforห่วง มันมักจะใช้เพื่อยุติการประมวลผลของลูปก่อนและจึงหลีกเลี่ยงifคำสั่งที่ซ้อนกันลึก ในตัวอย่างต่อไปนี้continueจะได้รับบรรทัดถัดไปโดยไม่ต้องประมวลผลคำสั่งต่อไปนี้ในวง

while (getNext(line)) {
  if (line.isEmpty() || line.isComment())
    continue;
  // More code here
}

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

บางครั้งcontinueก็ใช้เป็นตัวยึดตำแหน่งเพื่อทำให้ร่างกายลูปที่ว่างเปล่าชัดเจนยิ่งขึ้น

for (count = 0; foo.moreData(); count++)
  continue;

คำสั่งเดียวกันโดยไม่มีป้ายกำกับยังมีอยู่ใน C และ C ++ เทียบเท่าใน Perl nextคือ

ประเภทของการควบคุมการไหลนี้ไม่ได้แนะนำ แต่ถ้าคุณจึงเลือกคุณยังสามารถใช้continueในการจำลองรูปแบบ gotoจำกัด ในตัวอย่างต่อไปนี้continueจะดำเนินการfor (;;)ลูปที่ว่างเปล่าอีกครั้ง

aLoopName: for (;;) {
  // ...
  while (someCondition)
  // ...
    if (otherCondition)
      continue aLoopName;

513

continuegotoเป็นชนิดเช่น คุณคุ้นเคยbreakหรือไม่ มันง่ายที่จะคิดเกี่ยวกับพวกเขาในทางตรงกันข้าม:

  • break ยุติการวนซ้ำ (ข้ามไปยังรหัสด้านล่าง)

  • continue ยุติการประมวลผลส่วนที่เหลือของรหัสภายในลูปสำหรับการวนซ้ำปัจจุบัน แต่วนซ้ำต่อไป


1
ตัวอย่างที่ดีสำหรับการหยุดพักและดำเนินการต่อฉันคิดว่ามันเหมือนเดิมก่อน>. <
yfsx

เป็นไปไม่ได้ที่จะทำให้มันสมบูรณ์แบบ 500 ดี! +1
หมวก

100

ลองดูตัวอย่าง:

int sum = 0;
for(int i = 1; i <= 100 ; i++){
    if(i % 2 == 0)
         continue;
    sum += i;
}

นี่จะได้ผลรวมของเลขคี่เท่านั้นตั้งแต่ 1 ถึง 100


28

หากคุณคิดว่าของร่างกายของวงเป็นงานย่อยที่เป็นประเภทเช่นcontinue returnคำหลักเดียวกันมีอยู่ใน C และทำหน้าที่จุดประสงค์เดียวกัน นี่คือตัวอย่างที่วางแผนไว้:

for(int i=0; i < 10; ++i) {
  if (i % 2 == 0) {
    continue;
  }
  System.out.println(i);
}

สิ่งนี้จะพิมพ์เฉพาะเลขคี่


16

โดยทั่วไปฉันเห็นcontinue(และbreak) เป็นคำเตือนว่ารหัสอาจใช้การปรับโครงสร้างบางอย่างโดยเฉพาะอย่างยิ่งหากการประกาศwhileหรือการforวนซ้ำไม่ปรากฏในทันที เช่นเดียวกับสำหรับreturnในระหว่างวิธี แต่ด้วยเหตุผลที่แตกต่างกันเล็กน้อย

ตามที่คนอื่นพูดไปแล้วให้continueเดินไปที่การวนซ้ำครั้งต่อไปในขณะที่breakย้ายออกจากลูปการปิดล้อม

สิ่งเหล่านี้สามารถเป็น timebombs การบำรุงรักษาเนื่องจากไม่มีการเชื่อมโยงทันทีระหว่างcontinue/ breakและการวนซ้ำมันจะดำเนินการต่อ / แตกอื่นนอกเหนือจากบริบท; เพิ่มวงด้านในหรือย้าย "ความกล้า" ของวงเข้าไปในวิธีการแยกต่างหากและคุณมีผลที่ซ่อนอยู่ของcontinue/ breakล้มเหลว

IMHO เป็นการดีที่สุดที่จะใช้พวกเขาเป็นวิธีการสุดท้ายแล้วเพื่อให้แน่ใจว่าการใช้งานของพวกเขาถูกจัดกลุ่มเข้าด้วยกันอย่างแน่นหนาที่จุดเริ่มต้นหรือจุดสิ้นสุดของการวนรอบเพื่อให้นักพัฒนาคนต่อไปสามารถเห็น "ขอบเขต" .

continue, breakและreturn(นอกเหนือจาก One True Return ในตอนท้ายของวิธีการของคุณ) อยู่ในหมวดหมู่ทั่วไปของ "GOTO ที่ซ่อนอยู่" พวกเขาวางการควบคุมวงและฟังก์ชั่นในสถานที่ที่ไม่คาดคิดซึ่งในที่สุดก็ทำให้เกิดข้อบกพร่อง


ฉันสนใจในเหตุผลที่ผลตอบแทนไม่ดี ฉันมีความรู้สึกว่าการกลับมาไม่ดีเพราะสกาล่าไม่ได้กระตุ้นการกลับมา
Jus12

1
ในทางกลับกันการอนุญาตให้วิธีการย้อนกลับจากลูปที่ซ้อนกันอย่างลึกอาจเป็นวิธีที่ง่ายที่สุดอ่านได้ง่ายและเหมาะสมที่สุดในการทำสิ่งต่างๆแทนที่จะสร้างตัวแปรเพิ่มเติมเพื่อทำให้การออกจากลูปดูสะอาดขึ้น
David R Tribble

5

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

ตัวอย่าง: นี่คือรหัสสำหรับพิมพ์ตัวเลขคี่จาก 1 ถึง 10

คอมไพเลอร์จะเพิกเฉยต่อรหัสการพิมพ์เมื่อใดก็ตามที่เห็นว่ามันยังคงดำเนินต่อไปในการทำซ้ำครั้งถัดไป

for (int i = 0; i < 10; i++) { 
    if (i%2 == 0) continue;    
    System.out.println(i+"");
}


4

ดังที่ได้กล่าวแล้วcontinueจะข้ามการประมวลผลรหัสด้านล่างและจนกว่าจะสิ้นสุดของวง จากนั้นคุณจะถูกย้ายไปที่เงื่อนไขของลูปและเรียกใช้การวนซ้ำถัดไปหากเงื่อนไขนี้ยังคงมีอยู่ (หรือหากมีแฟล็กไปยังเงื่อนไขของลูปที่แสดง)

จะต้องมีการเน้นว่าในกรณีที่do - whileคุณถูกย้ายไปยังสภาพที่ด้านล่างหลังจากที่continueไม่ได้ที่จุดเริ่มต้นของวง

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

    Random r = new Random();
    Set<Integer> aSet= new HashSet<Integer>();
    int anInt;
    do {
        anInt = r.nextInt(10);
        if (anInt % 2 == 0)
            continue;
        System.out.println(anInt);
    } while (aSet.add(anInt));
    System.out.println(aSet);

* ถ้าคำตอบของคุณคือaSetจะมีตัวเลขคี่เพียง 100% ... คุณผิด!


4

ดำเนินการต่อเป็นคำหลักใน Java และใช้เพื่อข้ามการวนซ้ำปัจจุบัน

สมมติว่าคุณต้องการพิมพ์ตัวเลขคี่ทั้งหมดตั้งแต่ 1 ถึง 100

public class Main {

    public static void main(String args[]) {

    //Program to print all odd numbers from 1 to 100

        for(int i=1 ; i<=100 ; i++) {
            if(i % 2 == 0) {
                continue;
            }
            System.out.println(i);
        }

    }
}

ดำเนินการคำสั่งต่อไปในโปรแกรมข้างต้นเพียงข้ามการทำซ้ำเมื่อฉันเป็นคู่และพิมพ์ค่าของฉันเมื่อมันเป็นคี่

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


3

พิจารณาเงื่อนไข If Else คำสั่ง Continue ดำเนินการสิ่งที่มีอยู่ในเงื่อนไขและออกจากเงื่อนไขเช่นข้ามไปที่การทำซ้ำหรือเงื่อนไขต่อไป แต่ตัวแบ่งออกจากวง พิจารณาโปรแกรมต่อไปนี้ '

public class ContinueBreak {
    public static void main(String[] args) {
        String[] table={"aa","bb","cc","dd"};
        for(String ss:table){
            if("bb".equals(ss)){
                continue;
            }
            System.out.println(ss);
            if("cc".equals(ss)){
                break;
            }
        }
        System.out.println("Out of the loop.");
    }

}

จะพิมพ์: aa cc ออกจากลูป

ถ้าคุณใช้แบ่งในสถานที่ของการดำเนินการต่อไป (ถ้าหลังจาก.) มันก็จะพิมพ์ AA และออกจากวง

หากเงื่อนไขเป็น "bb" เท่ากับ ss เป็นไปตามเงื่อนไข: สำหรับดำเนินการต่อ: ไปที่การทำซ้ำครั้งถัดไปเช่น "cc" .equals (ss) สำหรับการหยุดพัก: มันมาจากลูปและพิมพ์ "ออกจากลูป"


2
ค่อนข้างแน่ใจว่ามันจะพิมพ์ซีซีตั้งแต่ "cc"! = "bb" และคำสั่งการพิมพ์อยู่ก่อนbreak
Ted Delezene

2

ฉันมาสายไปงานเลี้ยง แต่ ...

เป็นมูลค่าการกล่าวขวัญว่าcontinueมีประโยชน์สำหรับลูปเปล่าที่งานทั้งหมดทำในนิพจน์เงื่อนไขที่ควบคุมลูป ตัวอย่างเช่น:

while ((buffer[i++] = readChar()) >= 0)
    continue;

ในกรณีนี้งานทั้งหมดของการอ่านตัวอักษรและต่อท้ายbufferเสร็จแล้วจะทำในนิพจน์ที่ควบคุมwhileลูป continueงบทำหน้าที่เป็นตัวบ่งชี้ที่ภาพที่วงไม่จำเป็นต้องร่างกาย

มันชัดเจนกว่าที่เทียบเท่าเล็กน้อย:

while (...)
{ }

และสไตล์การเขียนโค้ดที่ดีกว่าและปลอดภัยกว่าการใช้คำสั่งเปล่าเช่น:

while (...)
    ;

ฉันยอมรับอย่างแน่นอนว่ามันสะอาดและรหัสอ่านได้มากกว่า แต่ฉันไม่แน่ใจว่าฉันทำตามข้อโต้แย้งของคุณว่ามันปลอดภัยกว่าตัวเลือกอื่นขณะที่ (statement); คั่นด้วยเซมิโคลอนโดยตรง
axolotl

@Aalok - ปลอดภัยกว่าเพราะเซมิโคลอนโดดเดี่ยวนั้นง่ายที่จะพลาดการมองเห็น นอกจากนี้ยังง่ายต่อการออกไปโดยไม่ตั้งใจซึ่งจะทำให้คำสั่งต่อไปหลังจากที่whileกลายเป็นร่างของwhileประโยคและที่จะไม่เห็นภาพ ชัดเจนcontinueชัดเจนและบ่งบอกถึงเจตนาที่คำสั่งที่ว่างเปล่าไม่ได้
David R Tribble

ฉันเข้าใจแล้วคุณหมายถึงส่วนใหญ่มาจากมุมมองการออกแบบ นั่นทำให้รู้สึก ฉันมีบางสิ่งบางอย่างเกี่ยวกับวิธีการจัดโครงสร้างในใจ
axolotl

1

โดยทั่วไปใน java, ดำเนินการต่อคือคำสั่ง ดังนั้นโดยปกติแล้ว statement จะใช้กับลูปเพื่อข้ามการวนซ้ำปัจจุบัน

สำหรับวิธีการและเวลาที่ใช้ในจาวาอ้างอิงลิงค์ด้านล่าง มันมีคำอธิบายพร้อมตัวอย่าง

https://www.flowerbrackets.com/continue-java-example/

หวังว่ามันจะช่วย !!


0

continue ต้องอยู่ในลูปมิฉะนั้นจะแสดงให้เห็นข้อผิดพลาดด้านล่าง:

ดำเนินการต่อนอกวง


0

คำสั่ง continue ใช้ในโครงสร้างการควบคุมลูปเมื่อคุณต้องการข้ามไปยังการวนซ้ำครั้งถัดไปของลูปทันที

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

ในกรณีที่มีการวนรอบด้านในจะเป็นการวนรอบต่อไปเท่านั้น

เราสามารถใช้คำสั่ง Java continue ในลูปทุกประเภทเช่น for loop, loop และ do-while loop

ตัวอย่างเช่น

class Example{
    public static void main(String args[]){
        System.out.println("Start");
        for(int i=0; i<10; i++){
            if(i==5){continue;}
            System.out.println("i : "+i);   
        }
        System.out.println("End.");
    }
}

เอาท์พุท:

Start
i : 0
i : 1
i : 2
i : 3
i : 4
i : 6
i : 7
i : 8
i : 9
End.

[หมายเลข 5 คือข้าม]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.