Trong chủ đề này, chúng tôi xem xét các ví dụ về cách sử dụng tốt goto
trong C hoặc C ++. Nó được lấy cảm hứng từ một câu trả lời mà mọi người đã bình chọn vì họ nghĩ rằng tôi đang nói đùa.
Tóm tắt (nhãn được thay đổi so với ban đầu để làm cho ý định rõ ràng hơn):
infinite_loop:
// code goes here
goto infinite_loop;
Tại sao nó tốt hơn các lựa chọn thay thế:
- Nó cụ thể.
goto
là cấu trúc ngôn ngữ tạo ra một nhánh không điều kiện. Các lựa chọn thay thế phụ thuộc vào việc sử dụng cấu trúc hỗ trợ các nhánh có điều kiện, với điều kiện suy biến luôn đúng. - Nhãn ghi lại ý định mà không có chú thích thêm.
- Người đọc không cần phải quét mã can thiệp sớm
break
(mặc dù vẫn có thể cho một hacker chưa có kinh nghiệm mô phỏngcontinue
sớmgoto
).
Quy tắc:
- Giả vờ rằng gotophobes không thắng. Người ta hiểu rằng những điều trên không thể được sử dụng trong mã thực vì nó đi ngược lại với thành ngữ đã có.
- Giả sử rằng tất cả chúng ta đã nghe nói về 'Goto bị coi là có hại' và biết rằng goto có thể được sử dụng để viết mã spaghetti.
- Nếu bạn không đồng ý với một ví dụ, hãy chỉ trích nó về mặt kỹ thuật ('Bởi vì mọi người không thích goto' không phải là lý do kỹ thuật).
Hãy xem liệu chúng ta có thể nói về điều này như những người trưởng thành không.
Biên tập
Câu hỏi này dường như đã kết thúc ngay bây giờ. Nó tạo ra một số câu trả lời chất lượng cao. Cảm ơn tất cả mọi người, đặc biệt là những người đã coi trọng ví dụ về vòng lặp nhỏ của tôi. Hầu hết những người hoài nghi đều lo lắng bởi việc thiếu phạm vi khối. Như @quinmars đã chỉ ra trong một nhận xét, bạn luôn có thể đặt các dấu ngoặc nhọn xung quanh thân vòng lặp. Tôi lưu ý khi vượt qua điều đó for(;;)
và while(true)
không cung cấp cho bạn niềng răng miễn phí (và việc bỏ qua chúng có thể gây ra lỗi khó chịu). Dù sao đi nữa, tôi sẽ không lãng phí thêm sức mạnh trí não của bạn vào chuyện vặt vãnh này - Tôi có thể sống với những điều vô hại và thành ngữ for(;;)
và while(true)
(cũng như nếu tôi muốn tiếp tục công việc của mình).
Xem xét các phản hồi khác, tôi thấy rằng nhiều người xem goto
như một thứ mà bạn luôn phải viết lại theo cách khác. Tất nhiên bạn có thể tránh một goto
bằng cách giới thiệu một vòng lặp, một cờ bổ sung, một chồng các if
s lồng nhau , hoặc bất cứ điều gì, nhưng tại sao không xem xét liệu goto
có lẽ là công cụ tốt nhất cho công việc? Nói cách khác, mọi người chuẩn bị chịu đựng sự xấu xí đến mức nào để tránh sử dụng một tính năng ngôn ngữ tích hợp cho mục đích dự định của nó? Ý kiến của tôi là ngay cả việc thêm một lá cờ cũng là một cái giá quá cao. Tôi thích các biến của mình đại diện cho những thứ trong miền vấn đề hoặc giải pháp. 'Chỉ để tránh một goto
' không cắt bỏ nó.
Tôi sẽ chấp nhận câu trả lời đầu tiên đưa ra mẫu C để phân nhánh cho một khối dọn dẹp. IMO, điều này là trường hợp mạnh nhất cho một goto
trong số tất cả các câu trả lời đã đăng, chắc chắn nếu bạn đo lường nó bằng những thách thức mà người ghét phải trải qua để tránh nó.