2010-07-14 32 views
33

Làm cách nào tôi có thể sử dụng câu lệnh 'ngắt' trong vòng lặp for mà tiếp tục tạo thành một nhãn được chỉ định?mục tiêu C cho vòng lặp ngắt và tiếp tục

ví dụ;

outer: for(int i = 0;i<[arABFBmatches count];i++){ 
    for(int i = 0;i<[arABFBmatches count];i++){ 
     // 
     break _____; 
    } 
} 

Làm cách nào để thoát ra ngoài?

Trả lời

94

Khó nói từ câu hỏi của bạn. Tôi muốn giải thích nó rằng bạn muốn bỏ qua phần còn lại của các vòng lặp của vòng lặp bên trong và tiếp tục vòng lặp bên ngoài?

for (int i = 0; i < [arABFBmatches count]; i++) { 
    for (int j = 0; j < [arABFBmatches count]; j++) { 
     if (should_skip_rest) 
      break; // let outer loop continue iterating 
    } 
} 

Lưu ý rằng tôi đã thay đổi tên của vòng lặp bên trong bất biến; sử dụng i trong cả hai đang mời sự điên rồ.

Nếu bạn muốn thoát khỏi cả hai vòng, tôi sẽ không sử dụng goto. Tôi muốn làm:

BOOL allDoneNow = NO; 
for (int i = 0; i < [arABFBmatches count]; i++) { 
    for (int j = 0; j < [arABFBmatches count]; j++) { 
     if (should_skip_rest) { 
      allDoneNow = YES; 
      break; 
     } 
    } 
    if (allDoneNow) break; 
} 
+32

+1 để mời sự điên rồ. – uchuugaka

+9

Và xin vui lòng, vì lợi ích của dễ đọc, chúng ta đừng quên đặt không gian xung quanh các nhà khai thác của chúng tôi. Không phải là "for (int i = 0; i <[số đếm arABFBmatches]; i ++)".Thay vào đó: "for (int i = 0; i <[arABFBmatches count]; i ++)" –

+0

Bạn là thiên tài. – GeneCode

9

Gần:

for(int i = 0;i<[arABFBmatches count];i++){ 
    for(int j = 0;j<[arABFBmatches count];j++){ 
     // 
     goto outer_done; 
    } 
} 
outer_done: 

Objective-C không có dán nhãn nghỉ ngơi.

+1

Nếu bạn định sử dụng 'goto', hãy rất cẩn thận khi xử lý bộ nhớ đúng cách. –

+0

'goto' tốt hơn là đặt cờ và kiểm tra cờ để cho biết có thoát ra khỏi vòng lặp ngoài hay không. chắc chắn chúng ta phải cẩn thận. – neevek

+4

Không nhất thiết phải tốt hơn chút nào; nếu vòng lặp bên trong được bao quanh bởi một số logic thiết lập/teardown, 'goto' có thể nhảy ngay trên giọt nước mắt. Nếu bạn phải thêm loại logic này sau, bạn có thể dễ dàng quên trường hợp ngắn mạch khi tái cấu trúc. Có một lập luận mạnh mẽ được thực hiện cho dòng chảy kiểm soát mà là bất lực. – bbum

1

'ngắt' sẽ chỉ đưa bạn ra khỏi vòng lặp hoặc chuyển đổi trong cùng. Bạn có thể sử dụng 'return' để thoát khỏi một hàm bất kỳ lúc nào. Vui lòng xem liên kết this.

+0

Hầu hết các quy tắc thiết kế thương mại chỉ yêu cầu một (1) 'trả lại' từ một hàm. – Vincent

1
BOOL done = NO; 
for(int i = 0;i<[arABFBmatches count] && !done; i++) 
{ 
    for(int i = 0;i<[arABFBmatches count] && !done;i++) 
    { 
     if (termination condition) 
     { 
      // cleanup 
      done = YES; 
     } 
    } 
} 
+1

Bạn cũng có thể thêm giải thích? – Robert

2

Từ docs Objective-C của Apple:

Objective-C được định nghĩa là một tập hợp nhỏ nhưng mạnh mẽ các phần mở rộng để tiêu chuẩn ngôn ngữ ANSI C.

Vì vậy, phá vỡ và tiếp tục có thể được sử dụng bất cứ nơi nào họ được phép trong C.

tiếp tục có thể được sử dụng trong vòng lặp cấu trúc (ví, thời gian và làm/vòng lặp while).

ngắt có thể được sử dụng trong cùng các cấu trúc vòng lặp đó cũng như trong báo cáo chuyển đổi.

2

bỏ phiếu xuống ...... Nếu sử dụng goto đơn giản hóa mã, thì nó sẽ phù hợp.

for (;;) 
{ 
    for (;;) 
    { 

     break; /* breaks inner loop */ 

    } 

    for (;;) 
    { 

     goto outer; /* breaks outer loop */ 
    } 

} 
outer:; 
+1

Câu trả lời này dường như được viết từ [bài đăng này] (http://stackoverflow.com/questions/863172/how-can-i-break-out-of-two-nested-for-loops-in-objective-c/863392 # 863392). – Pang

+0

Không, xin lỗi câu trả lời này là của riêng tôi. –

Các vấn đề liên quan