Là sử dụng goto bao giờ đáng giá?


29

gotohầu như không được khuyến khích. Là sử dụng tuyên bố này bao giờ đáng giá?



1
gotolà những gì cpu cuối cùng làm, nhưng nó không hoạt động tốt với những gì con người cần phải hiểu và trừu tượng do không có dấu hiệu trên đầu mục tiêu. So sánh với Intercal COMEFROM.

2
@ ThorbjørnRavnAndersen, con người có ý nghĩa gì khác khi họ nói về sự chuyển đổi trạng thái trong một máy trạng thái? Bạn có thể thấy một sự tương đồng? "Đi đến một trạng thái nhất định ", đó là ý nghĩa của nó và bất cứ điều gì khác sẽ không là gì ngoài một sự phức tạp không cần thiết của một điều tầm thường như vậy. Và bạn có ý nghĩa gì bởi "không có dấu"? Nhãn là một dấu hiệu như vậy.
SK-logic

@ SK-logic, tùy thuộc vào khoảng cách bạn sẽ cho phép goto đến từ đâu. Máy nhà nước không yêu cầu goto để thực hiện.

@ ThorbjørnRavnAndersen, tất nhiên gotolà không bắt buộc. Nó chỉ là cách hợp lý nhất để thực hiện chúng trong các ngôn ngữ bắt buộc, vì đó là điều gần nhất với chính ngữ nghĩa của quá trình chuyển đổi trạng thái. Và đích đến của nó có thể ở khá xa nguồn, nó sẽ không cản trở khả năng đọc. Ví dụ yêu thích của tôi về một mã như vậy là việc thực hiện trò chơi Phiêu lưu của DE Knuth.
SK-logic

Câu trả lời:


49

Điều này đã được thảo luận nhiều lần trên Stack Overflow và Chris Gillum đã tóm tắt các cách sử dụng có thể củagoto :

Thoát khỏi chức năng

Thông thường trong một chức năng, bạn có thể phân bổ tài nguyên và cần thoát ra ở nhiều nơi. Các lập trình viên có thể đơn giản hóa mã của họ bằng cách đặt mã dọn dẹp tài nguyên ở cuối hàm tất cả các "điểm thoát" của hàm sẽ lấy nhãn làm sạch. Bằng cách này, bạn không phải viết mã dọn dẹp tại mọi "điểm thoát" của chức năng.

Thoát khỏi các vòng lặp lồng nhau

Nếu bạn đang ở trong một vòng lặp lồng nhau và cần thoát ra khỏi tất cả các vòng lặp, một goto có thể làm cho việc này đơn giản và đơn giản hơn nhiều so với các câu lệnh break và if-check.

Cải thiện hiệu suất cấp thấp

Điều này chỉ hợp lệ trong mã quan trọng hoàn hảo, nhưng các câu lệnh goto thực thi rất nhanh và có thể giúp bạn tăng tốc khi di chuyển qua một hàm. Tuy nhiên, đây là con dao hai lưỡi, bởi vì trình biên dịch thường không thể tối ưu hóa mã có chứa gotos.

Tôi tranh luận, như nhiều người khác sẽ tranh luận, trong tất cả các trường hợp này, việc sử dụng gotođược sử dụng như một phương tiện để thoát khỏi một góc mà người ta tự mã hóa và nói chung là một triệu chứng của mã có thể được tái cấu trúc.


28
Vấn đề đầu tiên được giải quyết rất gọn gàng bằng finallycác khối trong các ngôn ngữ hiện đại và vấn đề thứ hai được giải quyết bằng nhãn breaks. Tuy nhiên, nếu bạn bị mắc kẹt với C, thì đó gotolà cách duy nhất để giải quyết những vấn đề này một cách thanh lịch.
Chinmay Kanchi

2
Điểm rất tốt. Tôi thích cách Java cho phép thoát ra khỏi nhiều cấp độ vòng lặp
Casebash

4
@Chinmay - cuối cùng các khối chỉ áp dụng cho 1) ngôn ngữ hiện đại có chúng và b) bạn có thể chịu đựng được chi phí (xử lý ngoại lệ có chi phí chung.) Nghĩa là, việc sử dụng finallychỉ hợp lệ trong các điều kiện đó. Có những tình huống rất hiếm, nhưng hợp lệ trong đó một goto là con đường để đi.
luis.espinal

21
Được rồi mọi người ... cái quái gì là sự khác biệt giữa break 3hoặc break myLabelgoto myLabel. Ồ, đó chỉ là từ khóa. Nếu bạn đang sử dụng break, continuehoặc một số từ khóa tương tự bạn đang sử dụng một Infact goto(nếu bạn đang sử dụng for, while, foreach, do/loopbạn đang sử dụng một goto có điều kiện.)
Matthew Whited

4
Về hiệu năng cấp thấp - hành vi của bộ xử lý hiện đại có thể khó dự đoán (đường ống, thực hiện không theo thứ tự) nên có thể trong 99% trường hợp không đáng hoặc thậm chí có thể chậm hơn. @MatthewWhited: Phạm vi. Nếu bạn nhập phạm vi tại điểm tùy ý thì không rõ (đối với con người) nên gọi hàm tạo nào (vấn đề cũng tồn tại trong C).
Maciej Piechotka

42

Các cấu trúc luồng điều khiển mức cao hơn có xu hướng tương ứng với các khái niệm trong miền vấn đề. Một if / other là một quyết định dựa trên một số điều kiện. Một vòng lặp nói để thực hiện một số hành động lặp đi lặp lại. Ngay cả một tuyên bố phá vỡ nói rằng "chúng tôi đã làm điều này nhiều lần, nhưng bây giờ chúng tôi cần phải dừng lại".

Mặt khác, một câu lệnh goto có xu hướng tương ứng với một khái niệm trong chương trình đang chạy, không phải trong miền vấn đề. Nó nói để tiếp tục thực hiện tại một điểm được chỉ định trong chương trình . Ai đó đọc mã phải suy luận điều đó có nghĩa gì đối với miền vấn đề.

Tất nhiên tất cả các cấu trúc cấp cao hơn có thể được xác định theo thuật ngữ gotos và các nhánh có điều kiện đơn giản. Điều đó không có nghĩa là họ chỉ đơn thuần là ngụy trang. Hãy nghĩ về chúng như những hình ảnh bị hạn chế - và đó là những hạn chế làm cho chúng hữu ích. Một tuyên bố phá vỡ được thực hiện như một bước nhảy đến cuối vòng lặp kèm theo, nhưng tốt hơn hết là bạn nên vận hành toàn bộ vòng lặp.

Tất cả những thứ khác đều bằng nhau, mã có cấu trúc phản ánh rằng miền vấn đề có xu hướng dễ đọc và duy trì hơn.

Không có trường hợp nào một tuyên bố goto là hoàn toàn bắt buộc (có một định lý cho hiệu ứng đó), nhưng có những trường hợp nó có thể là giải pháp kém nhất. Những trường hợp khác nhau tùy theo ngôn ngữ, tùy thuộc vào những gì cấu trúc cấp cao hơn mà ngôn ngữ hỗ trợ.

Ví dụ, trong C, tôi tin rằng có ba kịch bản cơ bản trong đó một goto là phù hợp.

  1. Thoát ra khỏi một vòng lặp lồng nhau. Điều này sẽ không cần thiết nếu ngôn ngữ có tuyên bố phá vỡ được dán nhãn.
  2. Bảo lãnh ra khỏi một đoạn mã (thường là thân hàm) trong trường hợp có lỗi hoặc sự kiện bất ngờ khác. Điều này sẽ không cần thiết nếu ngôn ngữ có ngoại lệ.
  3. Thực hiện một máy trạng thái hữu hạn rõ ràng. Trong trường hợp này (và, tôi nghĩ, chỉ trong trường hợp này) một goto tương ứng trực tiếp với một khái niệm trong miền vấn đề, chuyển từ trạng thái này sang trạng thái khác được chỉ định, trong đó trạng thái hiện tại được biểu thị bằng khối mã nào hiện đang thực thi .

Mặt khác, một máy trạng thái hữu hạn rõ ràng cũng có thể được thực hiện với một câu lệnh chuyển đổi bên trong một vòng lặp. Điều này có lợi thế là mọi trạng thái bắt đầu tại cùng một vị trí trong mã, có thể hữu ích cho việc gỡ lỗi, chẳng hạn.

Việc sử dụng chính của một goto trong một ngôn ngữ hợp lý hiện đại (một ngôn ngữ hỗ trợ if / other và các vòng lặp) là để mô phỏng một cấu trúc luồng điều khiển bị thiếu trong ngôn ngữ.


5
Đây thực sự là câu trả lời tốt nhất cho đến nay - khá ngạc nhiên, cho một câu hỏi đã được một tuổi rưỡi. :-)
Konrad Rudolph

1
+1 để "câu trả lời tốt nhất cho đến nay". --- "Việc sử dụng chính của một goto trong một ngôn ngữ hợp lý hiện đại (một ngôn ngữ hỗ trợ if / other và các vòng lặp) là để mô phỏng một cấu trúc luồng điều khiển bị thiếu trong ngôn ngữ."
Dave Dopson

Trong máy trạng thái câu lệnh chuyển đổi, mọi ghi vào giá trị điều khiển thực sự là a goto. SSSM thường là các cấu trúc tốt để sử dụng, vì chúng tách biệt trạng thái SM khỏi cấu trúc thực thi, nhưng chúng không thực sự loại bỏ "gotos".
supercat

2
"Tất cả những thứ khác đều bằng nhau, mã có cấu trúc phản ánh rằng miền của vấn đề có xu hướng dễ đọc và duy trì hơn." Tôi đã biết điều này hoàn toàn trong một thời gian dài nhưng thiếu từ ngữ để truyền đạt nó một cách chính xác theo cách mà các lập trình viên khác có thể và sẽ thực sự hiểu. Cảm ơn vì điều này.
tự đại diện

"Định lý chương trình có cấu trúc" làm tôi thích thú, vì nó có xu hướng chứng minh rõ ràng rằng việc sử dụng các câu lệnh lập trình có cấu trúc để mô phỏng một goto là dễ đọc hơn nhiều so với chỉ sử dụng một goto!

11

Chắc chắn nó phụ thuộc vào ngôn ngữ lập trình. Lý do chính gotođã gây tranh cãi là vì các hiệu ứng xấu của nó phát sinh khi trình biên dịch cho phép bạn sử dụng nó quá tự do. Các vấn đề có thể phát sinh, ví dụ, nếu nó cho phép bạn sử dụng gototheo cách mà bây giờ bạn có thể truy cập vào một biến chưa được khởi tạo, hoặc tệ hơn, để nhảy vào một phương thức khác và gây rối với ngăn xếp cuộc gọi. Trách nhiệm của trình biên dịch là không cho phép luồng điều khiển vô nghĩa.

Java đã cố gắng giải quyết vấn đề này bằng cách không cho phép gotohoàn toàn. Tuy nhiên, Java cho phép bạn sử dụng returnbên trong một finallykhối và do đó vô tình bị nuốt phải một ngoại lệ. Vấn đề tương tự vẫn còn đó: trình biên dịch không thực hiện công việc của nó. Xóa gotokhỏi ngôn ngữ đã không sửa nó.

Trong C #, gotolà an toàn như break, continue, try/catch/finallyreturn. Nó không cho phép bạn sử dụng các biến chưa được khởi tạo, nó không cho phép bạn nhảy ra khỏi một khối cuối cùng, vv Trình biên dịch sẽ phàn nàn. Điều này là bởi vì nó giải quyết vấn đề thực sự , giống như tôi đã nói dòng kiểm soát vô nghĩa. gotokhông hủy bỏ một cách kỳ diệu phân tích phân định xác định và kiểm tra trình biên dịch hợp lý khác.


Quan điểm của bạn là C # gotokhông phải là xấu xa? Nếu vậy, đó là trường hợp của mọi ngôn ngữ hiện đại được sử dụng thường xuyên với một gotocấu trúc, không chỉ C # ...
lvella

9

Vâng. Khi các vòng lặp của bạn được lồng sâu vài cấp, đó gotolà cách duy nhất để thoát ra khỏi vòng lặp bên trong. Tùy chọn khác là đặt cờ và thoát ra khỏi mỗi vòng lặp nếu cờ đó thỏa mãn một điều kiện. Điều này thực sự xấu xí, và dễ bị lỗi. Trong những trường hợp này, gotođơn giản là tốt hơn.

Tất nhiên, breakcâu lệnh được gắn nhãn của Java cũng làm điều tương tự, nhưng không cho phép bạn nhảy đến một điểm tùy ý trong mã, giải quyết vấn đề một cách gọn gàng mà không cho phép những điều gây ra gototội ác.


Bất cứ ai quan tâm để giải thích các downvote? Đây là một câu trả lời hoàn toàn hợp lệ cho câu hỏi ...
Chinmay Kanchi

4
goto không bao giờ là một câu trả lời thanh lịch. Khi các vòng lặp của bạn được lồng sâu vài cấp, vấn đề của bạn là bạn đã thất bại trong việc thiết kế mã của mình để tránh các vòng lặp đa biến. Các cuộc gọi thủ tục KHÔNG phải là kẻ thù. (Đọc các bài báo "Lambda: The Ultimate ...".) Sử dụng một chiếc goto để thoát ra khỏi các vòng lặp được lồng vào nhau ở một số cấp độ sâu đang đặt một băng hỗ trợ lên một vết nứt mở: có thể đơn giản nhưng nó không đúng câu trả lời.
John R. Strohm

6
Và tất nhiên, không bao giờ có trường hợp kỳ lạ khi các vòng lặp lồng nhau sâu được kêu gọi? Trở thành một lập trình viên giỏi không chỉ là tuân theo các quy tắc, mà còn về việc biết khi nào nên phá vỡ chúng.
Chinmay Kanchi

2
@ JohnR.Strohm Đừng bao giờ nói không bao giờ. Nếu bạn sử dụng thuật ngữ như "không bao giờ" trong lập trình, bạn đã rõ ràng không giải quyết các trường hợp góc, tối ưu hóa, contraints tài nguyên, vv Trong vòng lồng nhau sâu sắc, goto là rất nhiều thực sự là, cách thanh lịch sạch nhất để thoát khỏi vòng lặp. Không quan trọng bạn đã tái cấu trúc mã của mình bao nhiêu.
Sujay Phadke 6/2/2016

@ JohnR.Strohm: Tính năng bị bỏ lỡ nhiều thứ hai khi chuyển từ VB.NET sang C #: Dovòng lặp. Tại sao? Bởi vì tôi có thể thay đổi một vòng lặp cần đột phá sâu vào một Dovòng lặp và gõ Exit Dovà không có GoTo. Các vòng lặp lồng nhau xảy ra tất cả các thời gian. Phá vỡ các ngăn xếp xảy ra một số% thời gian.
Joshua

7

Hầu hết sự nản lòng đến từ một loại "tôn giáo" đã được tạo ra, Chúa Djikstra đã thuyết phục vào đầu những năm 60 về sức mạnh bừa bãi của nó:

  • nhảy bất cứ nơi nào vào bất cứ khối mã nào
    • chức năng không được thực hiện từ đầu
    • các vòng lặp không được thực hiện ngay từ đầu
    • bỏ qua khởi tạo biến
  • nhảy ra khỏi bất kỳ khối mã nào mà không có khả năng dọn dẹp.

Điều này không liên quan gì đến gototuyên bố của các ngôn ngữ hiện đại, mà sự tồn tại của nó chỉ đơn thuần là do hỗ trợ việc tạo ra các cấu trúc mã khác với ngôn ngữ được cung cấp.

Cụ thể, điểm chính đầu tiên ở trên không còn được cho phép và điểm thứ hai được làm sạch (nếu bạn gotora khỏi khối, ngăn xếp được thư giãn đúng cách và tất cả các hàm hủy thích hợp được gọi)

Bạn có thể tham khảo câu trả lời này để có ý tưởng về cách ngay cả mã không sử dụng goto có thể không đọc được. Vấn đề không phải là bản thân nó, mà là việc sử dụng nó không tốt.

Tôi có thể viết toàn bộ một chương trình mà không sử dụng if, chỉ cần for. Tất nhiên, nó sẽ không thể đọc được, một cái nhìn vụng về và phức tạp không cần thiết.

Nhưng vấn đề là không for. Tôi đây.

Những điều thích break, continue, throw, bool needed=true; while(needed) {...}, vv được lưu ý hơn giả trang goto để thoát ra khỏi scimitars của cuồng tín Djikstrarian, rằng -50 năm sau khi phát minh ra laguages- hiện đại vẫn muốn các tù nhân của họ. Họ đã quên những gì Djikstra đang nói, họ chỉ nhớ tiêu đề ghi chú của anh ấy (GOTO coi là có hại, và nó thậm chí không phải là tiêu đề của anh ấy: nó đã được biên tập viên thay đổi) và đổ lỗi và bash, bash và đổ lỗi cho mọi sự đối nghịch có 4 điều đó chữ được đặt theo thứ tự.

Đó là năm 2011: đã đến lúc phải hiểu rằng gotocần phải giải quyết GOTOtuyên bố mà Djikstra đã thuyết phục.


1
"Những thứ như phá vỡ, tiếp tục, ném, bool cần thiết = đúng; trong khi (cần thiết) {...}, v.v. không chú ý nhiều hơn goto giả trang" Tôi không đồng ý với điều đó. Tôi thích "những thứ như phá vỡ vv được giới hạn goto", hoặc một cái gì đó như thế. Vấn đề chính với goto là nó thường quá mạnh. Trong phạm vi mà goto hiện tại không mạnh hơn Dijkstra, câu trả lời của bạn là tốt với tôi.
Muhammad Alkarouri

2
@MuhammadAlkarouri: Tôi hoàn toàn đồng ý. Bạn chỉ tìm thấy một từ ngữ tốt hơn để thể hiện chính xác khái niệm của tôi. Quan điểm của tôi là những hạn chế đó đôi khi không thể áp dụng được và loại hạn chế bạn cần không có trong ngôn ngữ. Sau đó, một thứ "mạnh mẽ" hơn, ít chuyên biệt hơn, là thứ khiến bạn có thể giải quyết. Ví dụ, Java break nkhông có sẵn trong C ++, do đó goto escape, ngay cả khi escapekhông bắt buộc phải thoát ra khỏi vòng lặp n-ple.
Emilio Garavaglia

4

Goto lẻ ở đây hoặc ở đó, miễn là nó cục bộ với một chức năng, hiếm khi gây hại đáng kể cho khả năng đọc. Nó thường mang lại lợi ích cho nó bằng cách thu hút sự chú ý đến thực tế là có điều gì đó bất thường đang xảy ra trong mã này yêu cầu sử dụng cấu trúc điều khiển hơi không phổ biến.

Nếu gotos (cục bộ) gây hại đáng kể cho khả năng đọc, thì đó thường là dấu hiệu cho thấy chức năng chứa goto đã trở nên quá phức tạp.

Goto cuối cùng tôi đặt vào một đoạn mã C là để xây dựng một cặp vòng lặp lồng vào nhau. Nó không phù hợp với định nghĩa thông thường về việc sử dụng goto "chấp nhận được", nhưng kết quả là chức năng này nhỏ hơn và rõ ràng hơn. Để tránh goto sẽ yêu cầu một vi phạm DRY đặc biệt lộn xộn.


1
Câu trả lời cho điều này được nêu rõ nhất trong slogan "Lay's Potato Chips" cũ: "Cá là bạn không thể ăn chỉ một". Trong ví dụ của bạn, bạn có hai vòng lặp "lồng vào nhau" (bất kể điều đó có nghĩa là gì và tôi cá là nó không đẹp) và goto đã cho bạn một khoản tiền rẻ. Thế còn anh chàng bảo trì, người phải sửa đổi mã đó sau khi bạn bị xe buýt đâm thì sao? Là goto sẽ làm cho cuộc sống của mình dễ dàng hơn hoặc khó khăn hơn? Hai vòng lặp đó có cần suy nghĩ lại không?
John R. Strohm

3

Tôi nghĩ rằng toàn bộ vấn đề này đã là một trường hợp sủa sai cây.

GOTO như vậy dường như không có vấn đề gì với tôi, nhưng nó thường là một triệu chứng của một tội lỗi thực sự: mã spaghetti.

Nếu GOTO gây ra sự vượt qua chính của các dòng kiểm soát dòng chảy thì đó là thời gian xấu. Nếu nó vượt qua không có dòng kiểm soát dòng chảy, nó vô hại. Trong vùng màu xám ở giữa chúng ta có những thứ như gói cứu trợ vòng lặp, vẫn còn một số ngôn ngữ chưa thêm cấu trúc bao gồm tất cả các trường hợp màu xám hợp pháp.

Trường hợp duy nhất tôi thấy mình thực sự sử dụng nó trong nhiều năm là trường hợp của vòng lặp trong đó điểm quyết định nằm ở giữa vòng lặp. Bạn còn lại với mã trùng lặp, cờ hoặc GOTO. Tôi thấy giải pháp GOTO là tốt nhất trong ba. Không có sự vượt qua các dòng kiểm soát dòng chảy ở đây, nó vô hại.


Trường hợp mà bạn ám chỉ đôi khi được đặt tên là vòng lặp và một nửa hoặc N cộng với một nửa vòng lặp và đó là trường hợp sử dụng nổi tiếng cho gotos nhảy vào vòng lặp (nếu ngôn ngữ cho phép điều này; vì trường hợp khác, nhảy ra khỏi vòng lặp ở giữa, thường là tầm thường mà không có goto).
Konrad Rudolph

(Than ôi, hầu hết các ngôn ngữ đều cấm nhảy vào một vòng lặp.)
Konrad Rudolph

@KonradRudolph: Nếu bạn triển khai "vòng lặp" với GOTO, không có cấu trúc vòng lặp nào khác được nhảy vào.
Loren Pechtel

1
Tôi nghĩ về việc gotohét lên HOA HỒNG KIỂM SOÁT TẠI ĐÂY KHÔNG PHÙ HỢP VỚI CÁC BÀI TOÁN CẤU TRÚC BÌNH THƯỜNG . Bởi vì các luồng điều khiển phù hợp với các mẫu lập trình có cấu trúc dễ lý luận hơn các luồng không có, nên người ta nên cố gắng sử dụng các mẫu đó khi có thể; nếu mã không phù hợp với các mẫu như vậy, người ta không nên hét lên rằng nó không phù hợp. Mặt khác, trong trường hợp mã thực sự không phù hợp với các mẫu như vậy, hét lên về nó có thể tốt hơn là giả vờ mã phù hợp khi nó thực sự không phù hợp.
supercat

1

Có, goto có thể được sử dụng để mang lại lợi ích cho trải nghiệm của nhà phát triển: http://adamjonrichardson.com/2012/02/06/long-live-the-goto-statement/

Tuy nhiên, giống như với bất kỳ công cụ mạnh mẽ nào (con trỏ, nhiều kế thừa, v.v.), người ta phải bị xử lý kỷ luật khi sử dụng nó. Ví dụ được cung cấp trong liên kết sử dụng PHP, trong đó hạn chế việc sử dụng cấu trúc goto cho cùng một chức năng / phương thức và vô hiệu hóa khả năng nhảy vào một khối điều khiển mới (ví dụ: vòng lặp, câu lệnh chuyển đổi, v.v.)


1

Phụ thuộc vào ngôn ngữ. Nó vẫn được sử dụng rộng rãi trong lập trình Cobol, ví dụ. Tôi cũng đã từng làm việc trên một thiết bị Barionet 50, có ngôn ngữ lập trình phần sụn là một phương ngữ BASIC ban đầu, tất nhiên đòi hỏi bạn phải sử dụng Goto.


0

Tôi sẽ nói không. Nếu bạn thấy cần sử dụng GOTO, tôi sẽ cá rằng cần phải thiết kế lại mã.


3
Có thể, nhưng bạn chưa cung cấp bất kỳ lý do nào
Casebash

Dijkstra đã cung cấp lý do, chi tiết, nhiều thập kỷ trước.
John R. Strohm

2
Chỉ giáo điều. Không có tiếng vang. Lưu ý: Djikstra KHÔNG PHẢI LÀ BẤT K RES MỘT TÀI KHOẢN GIÁ TRỊ: nó đã đề cập đến tuyên bố BASIC hoặc FORTRAN GOTO vào đầu thập niên 60. Họ không có gì để làm với bệnh thiếu máu thực sự (so với sức mạnh của những người đó) ngày nay.
Emilio Garavaglia

0

gotocó thể hữu ích khi chuyển mã trình biên dịch mã kế thừa sang C. Trong trường hợp đầu tiên, chuyển đổi theo hướng dẫn sang C, sử dụng gotothay thế cho lệnh của trình biên dịch branch, có thể cho phép chuyển rất nhanh.


-1

Tôi sẽ không tranh luận. Chúng phải luôn được thay thế bằng một công cụ cụ thể hơn cho vấn đề mà goto đang được sử dụng để giải quyết (trừ khi nó không có sẵn trong ngôn ngữ của bạn). Ví dụ, các câu lệnh break và các trường hợp ngoại lệ giải quyết các vấn đề đã được giải quyết trước đó về thoát vòng lặp và xử lý lỗi.


Tôi cho rằng khi các ngôn ngữ có cả hai tính năng này, gotothường không có trong các ngôn ngữ đó.
Chinmay Kanchi

Nhưng đó là bởi vì họ không cần chúng, hay vì mọi người nghĩ rằng họ không cần chúng?
Michael K

Quan điểm của bạn là lớn. Có nhiều trường hợp khi đó gotolà điều gần nhất với ngữ nghĩa miền rất có vấn đề, bất cứ điều gì khác sẽ là một bản hack bẩn.
SK-logic

@ SK-logic: Tôi không nghĩ từ "lớn" có nghĩa là những gì bạn nghĩ nó có nghĩa.
Keith Thompson

1
@Keith, "không khoan dung với những ý kiến ​​và thành kiến ​​của chính mình" - đó là những gì tôi luôn quan sát ở đây, với trò bịt mắt bịt mắt này. "Nên luôn luôn được thay thế", ít nhất là những từ cuồng tín. Không có gì gần với một ý kiến ​​đúng đắn, hợp lý, nhưng chỉ là một sự cố chấp thuần túy. Điều này "luôn luôn" không để lại bất kỳ khoảng trống nào cho bất kỳ ý kiến ​​thay thế nào, thấy không?
SK-logic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.