2011-11-07 34 views
5

Giả sử bạn có hai lồng nhau cho vòng như thế này:Có cách nào để phá vỡ một vòng lặp siêu trong C?

int i, j; // Iterators 

for(i=0; i<100; ++i) { 
    /* do some stuff */ 
    ... 
    for(j=0; j<99; ++j) { 
     /* do more stuff */ 
     ... 
     if(someFunction(j,i) == 2) { 
      /* break out of both loops */ 
     } 
    } 
} 

Có cách nào (tương tự như lệnh break; chỉ trong một vòng lặp) để kết thúc cả hai vòng tại chỗ?

+8

'goto' rất tiện dụng. – Mat

+0

@Mat: Đó có phải là trò đùa không? – Rob

+3

@robjb Tôi nghi ngờ nó là. Đây là một trong những trường hợp 'goto' hoàn toàn ổn. Hận thù vô điều kiện đối với 'goto' là sai. – GSerg

Trả lời

13

Bạn có thể sử dụng một goto như:

int i, j; // Iterators 

for(i=0; i<100; ++i) { 
    /* do some stuff */ 
    ... 
    for(j=0; j<99; ++j) { 
     /* do more stuff */ 
     ... 
     if(someFunction(j,i) == 2) { 
      goto done; 
     } 
    } 
} 
done: 

hoặc sử dụng một biến khác để kiểm soát lặp loop:

int i, j; // Iterators 
int done = 0; 
for(i=0; i<100 && !done; ++i) { 
    /* do some stuff */ 
    ... 
    for(j=0; j<99 && !done; ++j) { 
     /* do more stuff */ 
     ... 
     if(someFunction(j,i) == 2) { 
      done = 1; 
     } 
    } 
} 
+0

+1 cho cả hai ý tưởng, mặc dù mọi người không thích 'goto', nó là nhanh hơn so với thêm để kiểm tra mỗi vòng (như trong tùy chọn thứ hai của bạn) – MByD

+0

! cờ thực hiện được xác minh mỗi vòng lặp mà không phải là tối ưu có vẻ như –

+1

+1 cho ý tưởng thứ hai. Đó là những gì tôi sẽ làm. 'goto' nhanh hơn, nhưng cũng nguy hiểm. Những điều kỳ lạ có thể xảy ra nếu bạn không chú ý nhiều trong khi viết nó. Việc xác minh cờ chỉ có thể được thực hiện trong vòng ngoài, thêm 'ngắt' ngay sau' done = 1; 'và nó sẽ giảm chi phí tính toán (Mặc dù nó rất nhỏ cho máy tính ngày nay) – Victor

5

Người bạn tốt của chúng tôi goto có thể xử lý điều đó cho bạn!

int i, j; // Iterators 

for(i=0; i<100; ++i) { 
    /* do some stuff */ 
    ... 
    for(j=0; j<99; ++j) { 
     /* do more stuff */ 
     ... 
     if(someFunction(j,i) == 2) { 
      /* break out of both loops */ 
      goto ExitLoopEarly; 
     } 
    } 
} 
goto ExitLoopNormal; 

ExitLoopEarly: 
.... 

ExitLoopNormal: 
... 
4

Đó có thể là một giải pháp

function void loop() 
{ 
       int i, j; // Iterators 

      for(i=0; i<100; ++i) { 
       /* do some stuff */ 
       ... 
       for(j=0; j<99; ++j) { 
        /* do more stuff */ 
        ... 
        if(someFunction(j,i) == 2) { 
         return; 
        } 
       } 
      } 
} 
+0

Điều này sẽ chỉ đáp ứng một số trường hợp, bạn bỏ qua bất kỳ giá trị nào mà nó có thể sử dụng bên trong vòng lặp. – MByD

+0

Ý của bạn là gì? Tôi thực sự không thể hiểu bạn –

+0

cho phép anh ta có ba vòng lặp như vậy trong một hàm, và trong các vòng lặp đó, anh ta sửa đổi một số biến địa phương của hàm, anh ta sẽ cần phải chuyển (tham chiếu) mỗi biến được sử dụng trong lặp lại hàm. goto hoặc một số lá cờ có vẻ hợp lý hơn nhiều. – MByD

0

Bạn có thể chèn hai lo ops trong một hàm và sử dụng return

void foo(){ 
int i, j; // Iterators 

for(i=0; i<100; ++i) { 
    /* do some stuff */ 
    ... 
    for(j=0; j<99; ++j) { 
     /* do more stuff */ 
     ... 
     if(someFunction(j,i) == 2) { 
      return; 
     } 
    } 
} 
} 
Các vấn đề liên quan