Vòng lặp C # - phá vỡ so với tiếp tục


797

Trong vòng lặp C # (thoải mái trả lời cho các ngôn ngữ khác), sự khác biệt giữa nghỉ và tiếp tục là phương tiện để rời khỏi cấu trúc của vòng lặp và đi đến lần lặp tiếp theo?

Thí dụ:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}

2
bài đăng trên blog với đỉnh cao dưới đây adamthings.com/post/2012/07/26/ mẹo
Adam

8
continue;sẽ ngừng xử lý hiện tại rowvà tiếp tục với phần tiếp theo row từ bộ sưu tập. Mặt khác, break;sẽ để lại foreachcâu lệnh hoàn toàn và các hàng còn lại sẽ không bao giờ được xử lý.
Jeppe Stig Nielsen

Câu trả lời:


1500

breaksẽ thoát hoàn toàn vòng lặp, continuesẽ chỉ bỏ qua bước lặp hiện tại.

Ví dụ:

for (int i = 0; i < 10; i++) {
    if (i == 0) {
        break;
    }

    DoSomeThingWith(i);
}

Việc ngắt sẽ khiến vòng lặp thoát ra trong lần lặp đầu tiên - DoSomeThingWithsẽ không bao giờ được thực thi. Đây

for (int i = 0; i < 10; i++) {
    if(i == 0) {
        continue;
    }

    DoSomeThingWith(i);
}

Sẽ không thực hiện DoSomeThingWithcho i = 0, nhưng vòng lặp sẽ tiếp tụcDoSomeThingWithsẽ được thực hiện cho i = 1đến i = 9.


2
Tại sao không có niềng răng của họ tiếp tục - tôi biết rằng nó hoạt động mà không có họ, nhưng tại sao?
George Willcox

52
@GeorgeWillcox Bản thân tôi trẻ hơn, ngốc nghếch hơn vẫn chưa học được giá trị của việc sử dụng niềng răng. (Chúng là tùy chọn trong C # cho các câu lệnh đơn, nhưng không đặt chúng giúp dễ dàng giới thiệu một lỗi sau này. Ngoài ra, hãy xem các lập trình
viên.stackexchange.com/a/16530/6342

386

Một cách thực sự dễ hiểu để hiểu điều này là đặt từ "vòng lặp" sau mỗi từ khóa. Các thuật ngữ bây giờ có ý nghĩa nếu chúng chỉ được đọc như các cụm từ hàng ngày.

break loop - looping bị hỏng và dừng lại.

continue loop - loop tiếp tục thực thi với lần lặp tiếp theo.


105

phá vỡ khiến bộ đếm chương trình nhảy ra khỏi phạm vi của vòng lặp trong cùng

for(i = 0; i < 10; i++)
{
    if(i == 2)
        break;
}

Hoạt động như thế này

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto BREAK;
}
BREAK:;

tiếp tục nhảy đến cuối vòng lặp. Trong một vòng lặp for, tiếp tục nhảy đến biểu thức tăng.

for(i = 0; i < 10; i++)
{
    if(i == 2)
        continue;

    printf("%d", i);
}

Hoạt động như thế này

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto CONTINUE;

    printf("%d", i);

    CONTINUE:;
}

2
Tôi nhận thấy rằng nhiều vòng lặp ở đây chỉ sử dụng forvòng lặp tiêu chuẩn , nhưng liệu vòng lặp này có hoạt động cho whilecác vòng lặp thử nghiệm trước và sau không? Các gotodẫn ký hiệu tôi tin như vậy, nhưng cần một số xác minh.
Công viên Daniel

1
@Daniel, đối với các vòng lặp WHILE bạn có thể sử dụng BREAK và TIẾP TỤC, không vấn đề gì.
Amila

@DanielPark Đối với cả while("đã được kiểm tra trước") và do- while("đã kiểm tra sau"), sau khi một continue;tuyên bố được đáp ứng, điều tiếp theo sẽ xảy ra là điều kiện vòng lặp được đánh giá để quyết định liệu có lặp lại bổ sung hay không. Tất nhiên, với break;điều kiện vòng lặp không được kiểm tra, vòng lặp chỉ đơn giản là thoát hoàn toàn. Vì vậy, sự gototương tự cũng tốt cho việc hiểu khía cạnh này.
Jeppe Stig Nielsen

37

Tôi đã luôn luôn bối rối liệu tôi nên sử dụng break, hay tiếp tục. Đây là những gì giúp tôi nhớ:

Khi nào sử dụng break vs tiếp tục?

  1. Phá vỡ - nó giống như chia tay. Thật đáng buồn, các bạn đang chia tay. Vòng lặp được thoát.

Phá vỡ

  1. Tiếp tục - có nghĩa là bạn sẽ cho hôm nay nghỉ ngơi và sắp xếp tất cả vào ngày mai (tức là bỏ qua bước lặp hiện tại)!

Tiếp tục


Sẽ chia sẻ điều này với đối tác của tôi. Có thể tiếp tục được đổi tên thành GetOverIt và Break nên được đổi tên thành MoveOnForward. Không có gì ngạc nhiên khi chúng ta được gọi là chuyên viên máy tính, Break có ý nghĩa như thế nào? Nghe có vẻ phá hoại. Và một thứ cần được thêm vào là - STOP, hoặc thậm chí tốt hơn EndIt - sẽ sửa nhiều lỗi và làm cho C-sharp thực sự sắc nét.
Mike

Lại rơi vào trận lụt Cùng một chuyến đi cũ. Tôi đã mắc một sai lầm lớn Hãy thử nhìn nó một lần theo cách của tôi
Talal Zahid

@TalalZahid tôi không hiểu?
BKSpurgeon

28

breaksẽ dừng foreachhoàn toàn vòng lặp, continuesẽ bỏ qua bước tiếp theo DataRow.


20

Có nhiều hơn một vài người không thích breakcontinue. Đơn khiếu nại mới nhất tôi thấy về họ là trong JavaScript: The Good Parts của Douglas Crockford. Nhưng tôi thấy rằng đôi khi sử dụng một trong số chúng thực sự đơn giản hóa mọi thứ, đặc biệt nếu ngôn ngữ của bạn không bao gồm một do-whilehoặc do-untilkiểu vòng lặp.

Tôi có xu hướng sử dụng breaktrong các vòng lặp đang tìm kiếm một danh sách cho một cái gì đó. Khi được tìm thấy, không có điểm nào để tiếp tục, vì vậy bạn cũng có thể bỏ thuốc lá.

Tôi sử dụng continuekhi làm một cái gì đó với hầu hết các yếu tố của một danh sách, nhưng vẫn muốn bỏ qua một vài.

Các breaktuyên bố cũng đi kèm trong khi bỏ phiếu thuận tiện cho một phản ứng có hiệu lực từ ai đó hoặc một cái gì đó. Thay vì:

Ask a question
While the answer is invalid:
    Ask the question

Bạn có thể loại bỏ một số trùng lặp và sử dụng:

While True:
    Ask a question
    If the answer is valid:
        break

Các do-untilvòng lặp mà tôi đã đề cập trước sự là giải pháp thanh lịch hơn cho rằng vấn đề cụ thể:

Do:
    Ask a question
    Until the answer is valid

Không trùng lặp, và cũng không breakcần thiết.


13

Tất cả đã đưa ra một lời giải thích rất tốt. Tôi vẫn đăng câu trả lời của mình chỉ để đưa ra một ví dụ nếu điều đó có thể giúp ích.

// break statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        break; // It will force to come out from the loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

Đây là đầu ra:

0 [Đã in] 1 [Đã in] 2 [Đã in]

Vì vậy, 3 [Đã in] & 4 [Đã in] sẽ không được hiển thị vì có ngắt khi i == 3

//continue statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        continue; // It will take the control to start point of loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

Đây là đầu ra:

0 [Đã in] 1 [Đã in] 2 [Đã in] 4 [Đã in]

Vì vậy, 3 [Đã in] sẽ không được hiển thị vì vẫn tiếp tục khi i == 3


7

Phá vỡ

Phá vỡ một vòng lặp để thoát ngay lập tức.

Tiếp tục

Điều này không đối nghịch với phá vỡ. Thay vì chấm dứt vòng lặp, nó lập tức lặp lại một lần nữa, bỏ qua phần còn lại của mã.


1
Tiếp tục kiểm tra điều kiện lặp quá :)
Grantly

1
Continuekhông đối lập với break, breakdừng vòng lặp, continuedừng lặp lại hiện tại.
Steven

6

Câu trả lời đơn giản:

Break thoát khỏi vòng lặp ngay lập tức.
Tiếp tục bắt đầu xử lý các mục tiếp theo. (Nếu có bất kỳ, bằng cách nhảy đến dòng đánh giá của for / while)


6

Ví dụ như

foreach(var i in Enumerable.Range(1,3))
{
    Console.WriteLine(i);
}

In 1, 2, 3 (trên các dòng riêng biệt).

Thêm một điều kiện phá vỡ tại i = 2

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        break;

    Console.WriteLine(i);
}

Bây giờ vòng lặp in 1 và dừng lại.

Thay thế nghỉ bằng tiếp tục.

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        continue;

    Console.WriteLine(i);
}

Bây giờ để lặp in 1 và 3 (bỏ qua 2).

Do đó, breakdừng vòng lặp, trong khi continuebỏ qua bước lặp tiếp theo.


5

Ruby không may là một chút khác nhau. Tái bút: Trí nhớ của tôi hơi mơ hồ về điều này nên xin lỗi nếu tôi sai

thay vì break / continue, nó có break / next, hoạt động tương tự về các vòng lặp

Vòng lặp (giống như mọi thứ khác) là các biểu thức và "trả lại" điều cuối cùng mà chúng đã làm. Hầu hết thời gian, nhận được giá trị trả về từ một vòng lặp là vô nghĩa, vì vậy mọi người chỉ cần làm điều này

a = 5
while a < 10
    a + 1
end

Tuy nhiên bạn có thể làm điều này

a = 5
b = while a < 10
    a + 1
end # b is now 10

TUY NHIÊN, rất nhiều mã ruby ​​'mô phỏng' một vòng lặp bằng cách sử dụng một khối. Ví dụ kinh điển là

10.times do |x|
    puts x
end

Vì nó phổ biến hơn nhiều đối với mọi người muốn làm mọi thứ với kết quả của một khối, đây là nơi nó trở nên lộn xộn. break / next có nghĩa là những thứ khác nhau trong bối cảnh của một khối.

phá vỡ sẽ nhảy ra khỏi mã được gọi là khối

tiếp theo sẽ bỏ qua phần còn lại của mã trong khối và 'trả lại' những gì bạn chỉ định cho người gọi của khối. Điều này không có ý nghĩa gì nếu không có ví dụ.

def timesten
    10.times{ |t| puts yield t }
end


timesten do |x|
   x * 2
end
# will print
2
4
6
8 ... and so on


timesten do |x|
    break
    x * 2
end
# won't print anything. The break jumps out of the timesten function entirely, and the call to `puts` inside it gets skipped

timesten do |x|
    break 5
    x * 2
end
# This is the same as above. it's "returning" 5, but nobody is catching it. If you did a = timesten... then a would get assigned to 5

timesten do |x|
    next 5
    x * 2
end 
# this would print
5
5
5 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.

Vì vậy, vâng. Ruby là tuyệt vời, nhưng nó có một số trường hợp góc khủng khiếp. Đây là thứ tồi tệ thứ hai tôi từng thấy trong những năm sử dụng nó :-)


5

Xin vui lòng để tôi nói rõ ràng: lưu ý rằng việc không thêm hoặc không tiếp tục, sẽ tiếp tục chương trình của bạn; tức là tôi đã mắc bẫy một lỗi nhất định, sau đó sau khi đăng nhập nó, tôi muốn tiếp tục xử lý và có nhiều tác vụ mã hơn ở giữa hàng tiếp theo, vì vậy tôi chỉ để nó rơi vào.


3

Để thoát hoàn toàn khỏi vòng lặp foreach, break được sử dụng;

Để đi đến lần lặp tiếp theo trong vòng lặp, tiếp tục được sử dụng;

Break rất hữu ích nếu bạn lặp qua một bộ sưu tập Đối tượng (như Hàng trong khả năng truy cập) và bạn đang tìm kiếm một trận đấu cụ thể, khi bạn tìm thấy kết quả khớp đó, không cần phải tiếp tục qua các hàng còn lại, vì vậy bạn muốn phá vỡ ngoài.

Tiếp tục là hữu ích khi bạn đã hoàn thành những gì bạn cần trong một vòng lặp lặp. Thông thường bạn sẽ tiếp tục sau một nếu .


2

nếu bạn không muốn sử dụng break, bạn chỉ cần tăng giá trị của I theo cách nó làm cho điều kiện lặp là sai và vòng lặp sẽ không thực thi trong lần lặp tiếp theo.

for(int i = 0; i < list.Count; i++){
   if(i == 5)
    i = list.Count;  //it will make "i<list.Count" false and loop will exit
}

0

Đối với các ngôn ngữ khác:

'VB
For i=0 To 10
   If i=5 then Exit For '= break in C#;
   'Do Something for i<5
next

For i=0 To 10
   If i=5 then Continue For '= continue in C#
   'Do Something for i<>5...
Next
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.