2012-08-31 35 views
7

Điều gì sẽ xảy ra khi phá vỡ vòng lặp lồng nhau?break in do while while

giả đoạn mã sau:

for(int x = 0; x < 10; x++) 
{ 
    do { 
     if(x == 4) 
      break; 
     x++; 
    } while(x != 1); 
} 

nào vòng lặp sẽ thoát về gặp lệnh break, các vòng lặp for hoặc làm trong khi vòng lặp?

+6

'break' sẽ chỉ thoát khỏi vòng lặp bên trong –

+0

nó sẽ thoát khỏi việc phải làm/thời gian, nếu bạn muốn thoát ra khỏi vòng lặp OUTER, bạn sẽ phải cuộn bằng câu lệnh goto ... – Shark

+2

Bạn có thể ngắt từ vòng lặp ngoài bằng nhiều cách. Bạn có thể 'goto', bạn có thể' return', bạn có thể đặt 'x = 10;', và như vậy onl. –

Trả lời

6

Các break luôn phá vỡ vòng lặp trong cùng.

6.8.6.3

Lệnh break chấm dứt thực hiện các kèm theo công tắc nhỏ hoặc lặp tuyên bố.


Nếu bạn muốn thoát ra khỏi cả hai vòng, sử dụng một nhãn sau khi for và nhảy với goto.

+0

Cảm ơn, nhưng goto chính xác là thứ tôi đang cố tránh, nó hơi xấu xí nhưng đó là ý kiến ​​của tôi. mặc dù nó gần giống với thực thi có điều kiện trong lắp ráp với các chi nhánh. – sgupta

+0

@ user1075375 Tôi thích goto. Tôi hiểu đó là hình thức xấu trong C++ và tôi sẽ không tranh luận. Nhưng trong C nó là khá tốt đẹp :-) – cnicutar

+0

Đặt một điều kiện bổ sung trong vòng lặp mà sẽ không đúng khi bạn muốn thoát ra khỏi nó? – teppic

0

Việc ngắt sẽ giết vòng lặp gần nhất/trong cùng nhất có chứa ngắt. Trong ví dụ của bạn, sự ngắt sẽ giết chết thời gian thực hiện, và điều khiển nhảy trở lại vòng lặp for(), và đơn giản là bắt đầu lặp lại tiếp theo của for().

Tuy nhiên, vì bạn đang sửa đổi x cả trong vòng lặp do() AND cho(), việc thực thi sẽ có một chút rung rinh. Bạn sẽ tạo ra một vòng lặp vô hạn khi X bên ngoài đạt đến 5.

+0

mã có nghĩa là chỉ vì lợi ích của nó. – sgupta

0

thời gian sẽ bị ngắt và vòng lặp for sẽ tiếp tục chạy.

4

Ngoài ra, bạn có thể sử dụng một lá cờ nếu bạn không muốn sử dụng goto:

int flag = 0; 

for(int x = 0; x < 10; x++) 
{ 
    do { 
     if(x == 4) { 
      flag = 1; 
      break; 
     } 
     x++; 
    } while(x != 1); 

if(flag) 
    break; // To break the for loop 
} 
+0

xem xét các chất thải của 4 byte trong bộ nhớ cache và kiểm tra thêm điều kiện trong vòng lặp, goto dường như tốt hơn interms hiệu suất. Nhiều hơn vì tôi mong đợi các vòng lặp để thực hiện rất nhiều lần. – sgupta

+1

Nếu sau buổi biểu diễn, bạn sẽ không viết mã này ngay từ đầu. Không cần phải có bên ngoài cho vòng lặp ở tất cả, nếu bạn đang đi để phá vỡ khi bạn nhận được một giá trị cụ thể. – Floris

+0

Đây không phải là mã tôi đã viết, Nó chỉ đơn giản là nhằm mục đích minh họa để giúp mọi người hiểu ý tôi. – sgupta

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