2011-12-15 71 views
51

Tôi có một tuyên bố nếu tôi muốn "phá vỡ" ra khỏi. Tôi hiểu rằng phá vỡ chỉ thực sự cho các vòng lặp. Có ai giúp được không?Làm cách nào để "thoát" ra khỏi câu lệnh if?

Đối với những người đòi hỏi một ví dụ về những gì tôi đang cố gắng để làm:

if(color == red) 
{ 
... 
if(car == hyundai) break; 
... 
} 
+3

Rất tiếc, không ai có thể trợ giúp. Bình chọn cho đóng. Không ai có thể giúp nếu bạn không cung cấp cho chúng tôi một số chi tiết với một số đoạn mã – Nawaz

+0

Hiển thị mã đại diện cho những gì bạn đang cố gắng làm. –

+2

Bạn có thể đưa ra một chút mã mẫu không? Và tùy thuộc vào tình hình, bạn có thể thử một khối 'switch' thay thế; họ hỗ trợ phá vỡ. – piebie

Trả lời

54

ifs lồng nhau:

if (condition) 
{ 
    // half-massive amount of code here 

    if (!breakOutCondition) 
    { 
     //half-massive amount of code here 
    } 
} 

Tại nguy cơ bị downvoted - nó xảy ra với tôi trong quá khứ - Tôi sẽ đề cập đến một tùy chọn khác (không được ưa chuộng) dĩ nhiên sẽ là số goto đáng sợ; một tuyên bố phá vỡ chỉ là một goto trong ngụy trang.

Và cuối cùng, tôi sẽ lặp lại tình cảm chung mà thiết kế của bạn có thể được cải thiện để tuyên bố lớn nếu không cần thiết, hãy để một mình thoát ra khỏi nó. Ít nhất bạn sẽ có thể để trích xuất một vài phương pháp, và sử dụng một sự trở lại:

if (condition) 
{ 
    ExtractedMethod1(); 

    if (breakOutCondition) 
     return; 

    ExtractedMethod2(); 
} 
+4

Tái cấu trúc khối thành các hàm sẽ không chỉ giúp khả năng đọc mà còn có thể giải quyết vấn đề ban đầu. –

+0

Chắc chắn đồng ý với quan sát thứ hai của bạn. Tuy nhiên, tôi sẽ nói rằng đường dẫn tốt hơn là tinh chỉnh 'điều kiện' ban đầu và thêm các điều kiện mới nếu cần, để khối mã được nhập khi nó được thỏa mãn tương ứng với những gì sẽ được thực thi * trước * ngắt trong OP ý tưởng ban đầu. Điều này giống như trong ví dụ của bạn, chỉ cần gọi một phương thức, sau đó có thể được gọi trong các điều kiện 'condition2',' condition3' vv khi cần thiết. –

+6

'goto' là một giải pháp tốt nếu vì lý do phạm vi biến, bạn không thể gọi một hàm khác. –

2

Luôn có một goto statement, nhưng tôi muốn giới thiệu làm tổ một if với nghịch đảo của tình trạng vi phạm.

2

Bạn có thể sử dụng nhãn và goto nhưng đây là một bản hack xấu. Bạn nên xem xét việc di chuyển một số nội dung trong câu lệnh if của bạn sang các phương thức riêng biệt.

1

Bạn có thể sử dụng goto, return, hoặc có lẽ gọi abort(), exit(), vv

2

Các ||&& nhà khai thác được ngắn mạch, vì vậy nếu phía bên trái của || đánh giá để true hoặc phía bên trái của && đánh giá để sai, phía bên phải sẽ không được đánh giá. Đó là tương đương với một break.

3

Bạn không thể thoát ra khỏi câu lệnh if, trừ khi bạn sử dụng goto.

if (true) 
{ 
     int var = 0; 
     var++; 
     if (var == 1) 
      goto finished; 
     var++; 
} 

finished: 
printf("var = %d\n", var); 

này sẽ cung cấp cho "var = 1" như đầu ra

16

Bạn có thể cần phải chia tay nếu tuyên bố của bạn thành từng miếng nhỏ. Điều đó đang được nói, bạn có thể làm hai việc:

  • quấn tuyên bố vào do {} while (false) và sử dụng thực break (không khuyến khích !!! kludge lớn !!!)

  • đặt câu lệnh vào chương trình con riêng của mình và sử dụng return Đây có thể là bước đầu tiên để cải thiện mã của bạn.

+4

Tôi đã nhìn thấy kỹ thuật 'do/while' được sử dụng và tôi sẽ không nhất thiết coi nó là một kludge nó hoạt động độc đáo và tránh các vấn đề' goto' có thể giới thiệu (ví dụ cố gắng nhảy qua khởi tạo biến) – Nim

+0

Tôi muốn đồng ý đó là một giải pháp tốt hơn goto. – Arkadiy

+0

@phoog, có thể, nhưng tôi không biết, câu hỏi được gắn thẻ C++, ở đâu nó không ... – Nim

32
if (test) 
{ 
    ... 
    goto jmp; 
    ... 
} 
jmp: 

Oh tại sao không :)

+1

Eww ... Tôi ngửi thấy một số khía cạnh trong câu trả lời này. Không phải là nó không chính xác về mặt kỹ thuật, tất nhiên rồi. – Yuck

+13

@Yuck Tên người dùng có liên quan đẹp. Đối với sự khéo léo, cũng một chút nhưng tôi sẽ nói rằng nếu thiết kế của bạn buộc bạn vào tình huống OP để bắt đầu, sau đó sử dụng một goto sẽ không làm cho nó tồi tệ hơn. Ngoài ra ghi chú phoog trong câu trả lời chiến thắng của mình rằng các điều kiện lồng nhau thực sự chỉ khác nhau bề ngoài. –

+0

Đôi khi bạn đang đối phó với mã mùi của người khác, và bạn không có một vài giờ/ngày để cấu trúc lại nó thành một cái gì đó lành mạnh ... r. –

2

Có một nhãn tại một điểm bạn muốn nhảy tới và ở bên bạn nếu sử dụng goto

if(condition){ 
    if(jumpCondition) goto label 
} 
label: 
1

tôi don không biết điều kiện thử nghiệm của bạn, nhưng một cái cũ tốt switch có thể hoạt động

switch(colour) 
{ 
    case red: 
    { 
    switch(car) 
    { 
     case hyundai: 
     { 
     break; 
     } 
     : 
    } 
    break; 
    } 
    : 
} 
Các vấn đề liên quan