Nó có phải là một thực hành xấu để sử dụng break trong một vòng lặp for? [đóng cửa]


123

Có phải là một thực hành xấu để sử dụng breaktuyên bố trong một forvòng lặp ?

Nói rằng, tôi đang tìm kiếm một giá trị trong một mảng. So sánh bên trong một vòng lặp for và khi tìm thấy giá trị, break;để thoát khỏi vòng lặp for.

Đây có phải là một thực hành xấu? Tôi đã thấy thay thế được sử dụng: xác định một biến vFoundvà đặt nó thành true khi tìm thấy giá trị và kiểm tra vFoundtrong forđiều kiện câu lệnh. Nhưng có cần thiết phải tạo một biến mới chỉ cho mục đích này không?

Tôi đang hỏi trong bối cảnh của một vòng lặp C hoặc C ++ bình thường.

PS: Hướng dẫn mã hóa MISRA khuyên không nên sử dụng break.


28
Đừng breaktham gia vào cùng một giải đấu như goto:)
BoltClock

2
Er, tôi đã không đặt chúng trong cùng một liên minh như đi đến ... quy tắc MISRA chỉ định phá vỡ, nếu tôi nhớ chính xác.
kiki

1
Lý do duy nhất tôi có thể nghĩ đến để không sử dụng break trong vòng lặp là khi bạn vẫn phải xử lý nhiều mục hơn có thể thay đổi kết quả của việc bạn đang làm ...
Younes

4
Các quy tắc MISRA đã được nới lỏng: misra.org.uk/forum/viewtopic.php?f=75&t=298
Johan Kotlinski

Câu trả lời:


122

Có rất nhiều câu trả lời ở đây, nhưng tôi chưa thấy điều này được đề cập:

Hầu hết các "nguy hiểm" liên quan đến việc sử dụng breakhoặc continuetrong vòng lặp for đều bị loại bỏ nếu bạn viết các vòng lặp gọn gàng, dễ đọc. Nếu phần thân của vòng lặp của bạn kéo dài một số độ dài màn hình và có nhiều khối con lồng nhau, vâng, bạn có thể dễ dàng quên rằng một số mã sẽ không được thực thi sau khi nghỉ. Tuy nhiên, nếu vòng lặp ngắn và đến điểm, mục đích của câu lệnh break nên rõ ràng.

Nếu một vòng lặp đang trở nên quá lớn, thay vào đó, hãy sử dụng một hoặc nhiều lệnh gọi hàm được đặt tên trong vòng lặp. Lý do thực sự duy nhất để tránh làm như vậy là để xử lý các tắc nghẽn.


11
Hơi đúng. Tất nhiên, nếu vòng lặp quá lớn và phức tạp đến mức khó có thể nhìn thấy những gì đang xảy ra bên trong nó, đó là vấn đề cho dù bạn có nghỉ ngơi hay không.
Jay

1
Một vấn đề khác là phá vỡ và tiếp tục gây ra vấn đề với tái cấu trúc. Đây có thể là một dấu hiệu cho thấy đây là một thực hành xấu. Mục đích của mã cũng rõ ràng hơn khi sử dụng câu lệnh if.
Ed Greaves

Các "lệnh gọi hàm được đặt tên tốt" đó có thể là các hàm lambda được xác định cục bộ thay vì các hàm riêng được xác định bên ngoài sẽ không được sử dụng ở nơi khác.
DavidRR

135

Không, phá vỡ là giải pháp chính xác.

Thêm một biến boolean làm cho mã khó đọc hơn và thêm một nguồn lỗi tiềm ẩn.


2
đã đồng ý. Đặc biệt nếu bạn đang tìm cách thoát khỏi vòng lặp dưới nhiều điều kiện. Boolean để lại một vòng lặp có thể thực sự gây nhầm lẫn sau đó.
Rontologist

2
Đó là lý do tại sao tôi sử dụng gotođể thoát ra khỏi Cấp 2+ vòng lồng nhau - bởi vì không cóbreak(level)
Петър Петров

3
Tôi muốn đặt mã vòng lặp trong một hàm và chỉ cần trả về. Điều này tránh được goto và chia mã của bạn thành các phần nhỏ hơn.
Dave Branton

53

Bạn có thể tìm thấy tất cả các loại mã chuyên nghiệp với các câu lệnh 'break' trong đó. Nó hoàn toàn có ý nghĩa để sử dụng này bất cứ khi nào cần thiết. Trong trường hợp của bạn, tùy chọn này tốt hơn là tạo một biến riêng biệt chỉ với mục đích ra khỏi vòng lặp.


47

Sử dụng breakcũng như continuetrong một forvòng lặp là hoàn toàn tốt.

Nó đơn giản hóa mã và cải thiện khả năng đọc của nó.


Có .. Trong một thời gian tôi không thích ý tưởng và mã hóa xung quanh nó, nhưng không mất nhiều thời gian trước khi tôi nhận ra ... "cách giải quyết" thường là một cơn ác mộng bảo trì. Chà, không phải là một cơn ác mộng, nhưng dễ bị lỗi hơn.
MetalMikester

24

Khác xa với thực tiễn xấu, Python (và các ngôn ngữ khác?) Đã mở rộng cấu trúc forvòng lặp để một phần của nó sẽ chỉ được thực thi nếu vòng lặp không break .

for n in range(5):
    for m in range(3):
        if m >= n:
            print('stop!')
            break
        print(m, end=' ')
    else:
        print('finished.')

Đầu ra:

stop!
0 stop!
0 1 stop!
0 1 2 finished.
0 1 2 finished.

Mã tương đương mà không có breakvà tiện dụng else:

for n in range(5):
    aborted = False
    for m in range(3):
        if not aborted:
            if m >= n:
                print('stop!')
                aborted = True
            else:            
                print(m, end=' ')
    if not aborted:
        print('finished.')

2
Oooh, tôi thích điều đó và đôi khi cũng mong muốn nó trong C. Cú pháp đẹp quá, có thể được điều chỉnh thành ngôn ngữ giống như C trong tương lai mà không có sự mơ hồ.
supercat

"Ngôn ngữ giống như C": P
nirvanaswap 18/03/2016

15

Không có gì sai khi sử dụng câu lệnh break nhưng các vòng lặp lồng nhau có thể gây nhầm lẫn. Để cải thiện khả năng đọc, nhiều ngôn ngữ ( ít nhất là Java ) hỗ trợ phá vỡ các nhãn sẽ cải thiện đáng kể khả năng đọc.

int[] iArray = new int[]{0,1,2,3,4,5,6,7,8,9};
int[] jArray = new int[]{0,1,2,3,4,5,6,7,8,9};

// label for i loop
iLoop: for (int i = 0; i < iArray.length; i++) {

    // label for j loop
    jLoop: for (int j = 0; j < jArray.length; j++) {

        if(iArray[i] < jArray[j]){
            // break i and j loops
            break iLoop;
        } else if (iArray[i] > jArray[j]){  
            // breaks only j loop
            break jLoop;
        } else {
            // unclear which loop is ending
            // (breaks only the j loop)
            break;
        }
    }
}

Tôi sẽ nói rằng các câu lệnh break (và return) thường làm tăng độ phức tạp theo chu kỳ khiến cho việc chứng minh mã đang làm điều đúng trong mọi trường hợp khó hơn.

Nếu bạn đang cân nhắc sử dụng thời gian nghỉ trong khi lặp lại một chuỗi cho một số mặt hàng cụ thể, bạn có thể muốn xem xét lại cấu trúc dữ liệu được sử dụng để giữ dữ liệu của mình. Sử dụng một cái gì đó như Bộ hoặc Bản đồ có thể cung cấp kết quả tốt hơn.


4
+1 cho độ phức tạp chu kỳ.
sp00m

Các lập trình viên .NET có thể muốn khám phá việc sử dụng LINQ như một giải pháp thay thế tiềm năng cho các forvòng lặp phức tạp .
DavidRR

14

break là một tuyên bố hoàn toàn có thể chấp nhận để sử dụng ( tiếp tục , btw). Đó là tất cả về khả năng đọc mã - miễn là bạn không có các vòng lặp quá phức tạp và như vậy, nó ổn.

Nó không giống như họ là cùng một giải đấu như goto . :)


Tôi đã thấy nó lập luận rằng một tuyên bố phá vỡ hiệu quả là một goto .
glenatron

3
Vấn đề với goto là bạn có thể chỉ ra nó ở bất cứ đâu. Cả hai phá vỡ và tiếp tục bảo tồn tính mô-đun của mã. Đối số đó ở cùng cấp độ với việc có một điểm thoát duy nhất cho mỗi hàm.
Zachary Yates

1
Tôi đã nghe nó lập luận rằng có nhiều điểm thoát cho một chức năng thực sự một goto . ; D
glenatron

2
@glenatron Vấn đề với goto không phải là câu lệnh goto, đó là sự giới thiệu nhãn mà goto nhảy vào đó là vấn đề. Khi bạn đọc một tuyên bố goto, không có sự không chắc chắn về luồng điều khiển. Khi bạn đọc nhãn, có rất nhiều điều không chắc chắn về luồng điều khiển (tất cả các gotos chuyển điều khiển sang nhãn này ở đâu?). Một tuyên bố phá vỡ không giới thiệu một nhãn, vì vậy nó không giới thiệu bất kỳ biến chứng mới.
Stephen C. Steel

1
"Break" là một goto đặc biệt chỉ có thể rời khỏi các khối. Các vấn đề lịch sử với "goto" là (1) có thể, và thường được sử dụng để xây dựng các khối vòng lặp chồng chéo theo cách không thể có với các cấu trúc điều khiển thích hợp; (2) một cách phổ biến để thực hiện một cấu trúc "nếu-thì" thường là "sai" là tách nhánh trường hợp thực sự sang một vị trí không liên quan trong mã, và sau đó phân nhánh lại. Điều này sẽ có giá hai chi nhánh trong trường hợp hiếm và 0 trong trường hợp phổ biến, nhưng nó làm cho mã trông thật gớm ghiếc.
supercat

14

Quy tắc chung: Nếu tuân theo một quy tắc yêu cầu bạn phải làm một cái gì đó khó xử và khó đọc hơn thì phá vỡ quy tắc, sau đó phá vỡ quy tắc.

Trong trường hợp lặp cho đến khi bạn tìm thấy một cái gì đó, bạn gặp phải vấn đề phân biệt được tìm thấy so với không tìm thấy khi bạn thoát ra. Đó là:

for (int x=0;x<fooCount;++x)
{
  Foo foo=getFooSomehow(x);
  if (foo.bar==42)
    break;
}
// So when we get here, did we find one, or did we fall out the bottom?

Vì vậy, ổn, bạn có thể đặt cờ hoặc khởi tạo giá trị "tìm thấy" thành null. Nhưng

Đó là lý do tại sao nói chung tôi thích đẩy các tìm kiếm của mình vào các chức năng:

Foo findFoo(int wantBar)
{
  for (int x=0;x<fooCount;++x)
  {
    Foo foo=getFooSomehow(x);
    if (foo.bar==wantBar)
      return foo;
  }
  // Not found
  return null;
}

Điều này cũng giúp giải nén mã. Trong dòng chính, "find" trở thành một câu lệnh duy nhất và khi các điều kiện phức tạp, chúng chỉ được viết một lần.


1
Chính xác những gì tôi muốn nói. Thông thường khi tôi thấy mình đang sử dụng break, tôi cố gắng tìm một số cách để cấu trúc lại mã thành một hàm, để tôi có thể sử dụng returnthay thế.
Rene Saarsoo

Tôi đồng ý 100% với bạn, không có gì sai khi sử dụng break. Tuy nhiên, nó thường chỉ ra rằng mã mà nó có thể cần được trích xuất thành một hàm trong đó ngắt sẽ được thay thế bằng trả về. Nó nên được coi là một "mùi mã" chứ không phải là một sai lầm hoàn toàn.
vascowhite

Câu trả lời của bạn có thể khiến một số người khám phá khả năng sử dụng nhiều câu trả về .
DavidRR

13

Nó phụ thuộc vào ngôn ngữ. Trong khi bạn có thể có thể kiểm tra một biến boolean ở đây:

for (int i = 0; i < 100 && stayInLoop; i++) { ... }

không thể làm điều đó khi lặp qua một mảng:

for element in bigList: ...

Dù sao, breaksẽ làm cho cả hai mã dễ đọc hơn.


7

Trong ví dụ của bạn, bạn không biết số lần lặp cho vòng lặp for . Tại sao không sử dụng trong khi vòng lặp thay vào đó, cho phép số lần lặp là không xác định ngay từ đầu?

Đó là vì thế không cần thiết phải sử dụng phá vỡ statemement nói chung, như vòng lặp có thể nói tốt hơn là một khi vòng lặp.


1
Vòng lặp "for" thường tốt nếu có số lần lặp tối đa đã biết. Điều đó đã được nói, một vòng lặp (1) đôi khi tốt hơn trong một kịch bản trong đó một người đang tìm kiếm một vật phẩm và dự định tạo ra nó nếu nó không tồn tại. Trong trường hợp đó, nếu mã tìm thấy mục đó, nó sẽ ngắt trực tiếp và nếu nó chạm vào cuối của mảng, nó sẽ tạo ra một mục mới và sau đó thực hiện ngắt.
supercat

2
Trong ví dụ đã cho - tìm kiếm thông qua một mảng cho khóa, vòng lặp for là cấu trúc thành ngữ phù hợp. Bạn không sử dụng vòng lặp while để đi qua một mảng. Bạn sử dụng một vòng lặp for. (hoặc một vòng lặp cho mỗi vòng nếu có). Bạn làm điều này như một phép lịch sự với các lập trình viên khác, vì họ nhận ra cấu trúc "for (int i = 0; i <ra.length; i ++) {}" ngay lập tức là "Đi qua mảng" Thêm dấu ngắt, vào cấu trúc này là chỉ đơn giản là một câu "Thoát sớm nếu bạn có thể".
Chris Cudmore

7

Tôi đồng ý với những người khuyên bạn nên sử dụng break. Câu hỏi hậu quả rõ ràng là tại sao mọi người sẽ đề nghị khác? Chà ... khi bạn sử dụng break, bạn bỏ qua phần còn lại của mã trong khối và các lần lặp còn lại. Đôi khi điều này gây ra lỗi, ví dụ:

  • một tài nguyên thu được ở đầu khối có thể được giải phóng ở phía dưới (điều này đúng ngay cả với các khối bên trong forcác vòng lặp), nhưng bước phát hành đó có thể vô tình bị bỏ qua khi một lối thoát "sớm" được gây ra bởi một breakcâu lệnh (trong "hiện đại" C ++, "RAII" được sử dụng để xử lý việc này theo cách đáng tin cậy và an toàn ngoại lệ: về cơ bản, các đối tượng phá hủy tài nguyên miễn phí đáng tin cậy cho dù phạm vi được thoát ra như thế nào)

  • ai đó có thể thay đổi kiểm tra có điều kiện trong fortuyên bố mà không nhận thấy rằng có các điều kiện thoát khác

  • Câu trả lời của ndim quan sát rằng một số người có thể tránh breaks để duy trì thời gian chạy vòng lặp tương đối nhất quán, nhưng bạn đang so sánh breakvới việc sử dụng biến kiểm soát thoát sớm boolean trong đó không giữ

Thỉnh thoảng mọi người quan sát các lỗi như vậy nhận ra rằng chúng có thể được ngăn chặn / giảm thiểu theo quy tắc "không nghỉ" này ... thực sự, có một chiến lược liên quan đến lập trình "an toàn hơn" gọi là "lập trình có cấu trúc", trong đó mỗi chức năng được cho là có một điểm vào và thoát duy nhất cũng vậy (tức là không có goto, không quay lại sớm). Nó có thể loại bỏ một số lỗi, nhưng nó chắc chắn giới thiệu những người khác. Tại sao họ làm điều đó?

  • họ có một khung phát triển khuyến khích một phong cách lập trình / mã cụ thể và họ có bằng chứng thống kê rằng điều này tạo ra lợi ích ròng trong khung hạn chế đó, hoặc
  • họ đã bị ảnh hưởng bởi các nguyên tắc lập trình hoặc kinh nghiệm trong một khung như vậy, hoặc
  • họ chỉ là những kẻ ngốc độc tài, hoặc
  • bất kỳ quán tính trên + nào trong lịch sử (có liên quan ở chỗ các biện minh được áp dụng cho C nhiều hơn C ++ hiện đại).

Vâng, vâng, nhưng sau đó một lần nữa tôi đã thấy các lỗi trong mã bởi những người tôn giáo đã cố gắng tránh break. Họ đã tránh nó nhưng không nghĩ đến các điều kiện thay thế việc sử dụng phá vỡ.
Tomáš Zato - Phục hồi Monica

5

Nó hoàn toàn hợp lệ để sử dụng break- như những người khác đã chỉ ra, nó không ở đâu trong cùng một liên minh nhưgoto .

Mặc dù bạn có thể muốn sử dụng vFoundbiến khi bạn muốn kiểm tra bên ngoài vòng lặp xem giá trị có được tìm thấy trong mảng không. Cũng theo quan điểm duy trì, việc có một cờ chung báo hiệu các tiêu chí thoát có thể hữu ích.


5

Tôi đã thực hiện một số phân tích về cơ sở mã hiện tôi đang làm việc (40.000 dòng JavaScript).

Tôi chỉ tìm thấy 22 break câu, trong số đó:

  • 19 đã được sử dụng bên trong các switchcâu lệnh (chúng tôi chỉ có tổng cộng 3 câu lệnh chuyển đổi!).
  • 2 đã được sử dụng bên trong for các vòng lặp - một mã mà tôi đã phân loại ngay lập tức để được tái cấu trúc thành các hàm riêng biệt và được thay thế bằng returncâu lệnh.
  • Đối với trận chung kết breakbên trongwhile vòng lặp ... Tôi chạy git blameđến xem ai đã viết cái thứ nhảm nhí này!

Vì vậy, theo thống kê của tôi: Nếu breakđược sử dụng bên ngoài switch, nó là một mùi mã.

Tôi cũng đã tìm kiếm các continuebáo cáo. Không tìm thấy.


4

Tôi không thấy bất kỳ lý do nào khiến nó trở thành một thông lệ xấu CUNG CẤP rằng bạn muốn hoàn thành quá trình xử lý STOP tại thời điểm đó.


4

Trong thế giới nhúng, có rất nhiều mã sử dụng cấu trúc sau:

    while(1)
    { 
         if (RCIF)
           gx();
         if (command_received == command_we_are_waiting_on)
           break;
         else if ((num_attempts > MAX_ATTEMPTS) || (TickGet() - BaseTick > MAX_TIMEOUT))
           return ERROR;
         num_attempts++;
    }
    if (call_some_bool_returning_function())
      return TRUE;
    else
      return FALSE;

Đây là một ví dụ rất chung chung, rất nhiều điều đang xảy ra đằng sau bức màn, đặc biệt là sự gián đoạn. Đừng sử dụng mã này làm mã soạn sẵn, tôi chỉ đang cố gắng minh họa một ví dụ.

Ý kiến ​​cá nhân của tôi là không có gì sai khi viết một vòng lặp theo cách này miễn là sự chăm sóc thích hợp được thực hiện để ngăn chặn việc tồn tại trong vòng lặp vô thời hạn.


1
Bạn có thể giải thích về điều đó? Đối với tôi như thể vòng lặp hoàn toàn không có gì ... trừ khi có các continuecâu lệnh bên trong logic ứng dụng. Có phải không
Rene Saarsoo

1
tiếp tục báo cáo là không cần thiết vì bạn đã bị ràng buộc bởi một vòng lặp vô hạn. Về cơ bản, bạn thực hiện logic cần thiết để đạt được mục tiêu và nếu mục tiêu đó không được đáp ứng trong n số lần thử hoặc điều kiện hết thời gian, bạn thoát khỏi vòng lặp thông qua cấu trúc ngắt và thực hiện hành động khắc phục hoặc thông báo mã gọi lỗi. Tôi thấy loại mã này thường xuyên trong các uC giao tiếp qua một xe buýt chung (RS-485, v.v.) Về cơ bản, bạn cố gắng nắm bắt đường truyền và liên lạc mà không có va chạm, nếu xảy ra va chạm, bạn đợi một khoảng thời gian được xác định bởi một số ngẫu nhiên và thử lần nữa.
Nate

1
Ngược lại, nếu mọi việc suôn sẻ, bạn cũng sử dụng câu lệnh break để thoát khi điều kiện được đáp ứng. Với trường hợp này, mã theo vòng lặp được thực thi và mọi người đều vui vẻ.
Nate

"if (call_some_bool_retinating_function ()) trả về TRUE; khác trả về FALSE;" chỉ có thể là "return call_some_bool_retinating_feft ()"
frankster

3

Phụ thuộc vào trường hợp sử dụng của bạn. Có những ứng dụng trong đó thời gian chạy của vòng lặp for cần phải không đổi (ví dụ để đáp ứng một số ràng buộc về thời gian hoặc để ẩn nội bộ dữ liệu của bạn khỏi các cuộc tấn công dựa trên thời gian).

Trong những trường hợp đó, thậm chí sẽ có ý nghĩa khi đặt cờ và chỉ kiểm tra giá trị cờ SAU tất cả các forlần lặp thực sự đã chạy. Tất nhiên, tất cả các lần lặp vòng lặp for cần chạy mã mà vẫn mất cùng thời gian.

Nếu bạn không quan tâm đến thời gian chạy ... hãy sử dụng break;continue;để làm cho mã dễ đọc hơn.


1
Nếu thời gian là quan trọng, bạn có thể ngủ ngon hơn và tiết kiệm tài nguyên hệ thống hơn là để chương trình thực hiện các hoạt động vô dụng.
Bss

2

Theo quy tắc MISRA 98, được sử dụng cho công ty của tôi trong C dev, tuyên bố phá vỡ sẽ không được sử dụng ...

Chỉnh sửa: Nghỉ được phép trong MISRA '04


2
Chính xác tại sao tôi hỏi câu hỏi này! Tôi thấy không có lý do chính đáng tại sao một quy tắc như vậy là có một hướng dẫn mã hóa. Ngoài ra, như mọi người khác ở đây đã nói, phá vỡ; trông tốt hơn.
kiki

1
Tôi không biết chính xác tại sao nó bị cấm (người thông minh hơn tôi nghĩ về nó ...) nhưng phá vỡ (và trả lại nhiều lần) tốt hơn cho khả năng đọc (theo ý kiến ​​của tôi, nhưng ý kiến ​​của tôi không phải là quy tắc ... )
Benoît

1
Uh, các quy tắc MISRA cho phép sử dụng các câu lệnh break: misra.org.uk/forum/viewtopic.php?f=75&t=298
luis.espinal

Chúng tôi đã sử dụng các quy tắc MISRA 98 ... Chính xác là MISRA 2004 thay đổi các quy tắc
Benoît

0

Tất nhiên, break;là giải pháp để dừng vòng lặp for hoặc vòng foreach. Tôi đã sử dụng nó trong php trong foreach và for loop và thấy hoạt động.


0

Tôi không đồng ý!

Tại sao bạn lại bỏ qua chức năng tích hợp của vòng lặp for để tạo riêng cho mình? Bạn không cần phải phát minh lại bánh xe.

Tôi nghĩ rằng sẽ có ý nghĩa hơn khi kiểm tra của bạn ở đầu vòng lặp for của bạn như vậy

for(int i = 0; i < myCollection.Length && myCollection[i].SomeValue != "Break Condition"; i++)
{
//loop body
}

hoặc nếu bạn cần xử lý hàng trước

for(int i = 0; i < myCollection.Length && (i == 0 ? true : myCollection[i-1].SomeValue != "Break Condition"); i++)
{
//loop body
}

Bằng cách này bạn có thể viết một hàm để thực hiện mọi thứ và tạo mã sạch hơn nhiều.

for(int i = 0; i < myCollection.Length && (i == 0 ? true : myCollection[i-1].SomeValue != "Break Condition"); i++)
{
    DoAllThatCrazyStuff(myCollection[i]);
}

Hoặc nếu tình trạng của bạn phức tạp, bạn cũng có thể chuyển mã đó ra!

for(int i = 0; i < myCollection.Length && BreakFunctionCheck(i, myCollection); i++)
{
    DoAllThatCrazyStuff(myCollection[i]);
}

"Mã chuyên nghiệp" bị đánh đố với các ngắt không thực sự nghe giống như mã chuyên nghiệp đối với tôi. Nghe có vẻ như mã hóa lười biếng;)


4
mã hóa lười biếng là mã chuyên nghiệp :)
Jason

Chỉ khi đó không phải là một cơn đau ở mông để duy trì :)
Biff MaGriff

2
Tôi có xu hướng thực hành "GTFO ASAP". Đó là, nếu tôi có thể thoát khỏi một cấu trúc sạch sẽ thì tôi nên làm điều đó càng sớm càng tốt, và càng gần với điều kiện chỉ định thoát.
Chris Cudmore

Vâng, nó cũng hoạt động. Tôi nghĩ rằng đối số mà tôi đang cố gắng vượt qua là nếu bạn đang sử dụng một vòng lặp for thì việc sử dụng chức năng tích hợp của nó để làm cho mã của bạn có thể đọc và mô đun hóa được là không hại. Nếu bạn thực sự cần phải có các tuyên bố phá vỡ trong vòng lặp của mình, tôi sẽ ngồi và suy nghĩ về lý do tại sao mức độ phức tạp đó lại cần thiết.
Biff MaGriff

1
Haha. Hãy xem xét thực tế rằng hầu hết những người không khuyến khích breaklập luận rằng đó là khả năng đọc mã. Bây giờ nhìn lại 5 dặm tình trạng lâu điên trong các vòng trên ...
Tomáš Zato - Khôi phục Monica
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.