In diesem Thread sehen wir uns Beispiele für gute Verwendungen goto
in C oder C ++ an. Es ist inspiriert von einer Antwort, die die Leute gewählt haben, weil sie dachten, ich mache Witze.
Zusammenfassung (Bezeichnung vom Original geändert, um die Absicht noch deutlicher zu machen):
infinite_loop:
// code goes here
goto infinite_loop;
Warum ist es besser als die Alternativen:
- Es ist spezifisch.
goto
ist das Sprachkonstrukt, das einen bedingungslosen Zweig verursacht. Alternativen hängen von der Verwendung von Strukturen ab, die bedingte Verzweigungen mit einem entarteten, immer zutreffenden Zustand unterstützen. - Das Etikett dokumentiert die Absicht ohne zusätzliche Kommentare.
- Der Leser muss den dazwischenliegenden Code nicht nach frühen
break
s scannen (obwohl es für einen Hacker ohne Prinzipien immer noch möglich ist,continue
mit einem frühen zu simulierengoto
).
Regeln:
- Stellen Sie sich vor, die Gotophoben hätten nicht gewonnen. Es versteht sich, dass das oben Genannte nicht in echtem Code verwendet werden kann, da es gegen etablierte Redewendungen verstößt.
- Nehmen wir an, wir haben alle von "Goto als schädlich angesehen" gehört und wissen, dass goto zum Schreiben von Spaghetti-Code verwendet werden kann.
- Wenn Sie mit einem Beispiel nicht einverstanden sind, kritisieren Sie es nur aus technischen Gründen ("Weil die Leute goto nicht mögen" ist kein technischer Grund).
Mal sehen, ob wir wie Erwachsene darüber sprechen können.
Bearbeiten
Diese Frage scheint jetzt erledigt zu sein. Es wurden einige qualitativ hochwertige Antworten generiert. Vielen Dank an alle, besonders an diejenigen, die mein kleines Loop-Beispiel ernst genommen haben. Die meisten Skeptiker waren besorgt über den fehlenden Blockumfang. Wie @quinmars in einem Kommentar hervorhob, können Sie den Loop-Body immer mit geschweiften Klammern versehen. Ich stelle dies nebenbei fest for(;;)
und while(true)
gebe Ihnen die Zahnspange auch nicht kostenlos ( und wenn Sie sie weglassen, kann dies zu ärgerlichen Fehlern führen). Wie auch immer, ich werde nicht mehr von Ihrer Gehirnleistung für diese Kleinigkeit verschwenden - ich kann mit den harmlosen und idiomatischen for(;;)
und while(true)
(genauso gut, wenn ich meinen Job behalten will) leben.
In Anbetracht der anderen Antworten sehe ich, dass viele Leute dies goto
als etwas ansehen , das Sie immer auf eine andere Weise umschreiben müssen. Natürlich können Sie dies vermeiden, goto
indem Sie eine Schleife, ein zusätzliches Flag, einen Stapel verschachtelter if
s oder was auch immer einführen , aber warum nicht überlegen, ob dies goto
vielleicht das beste Werkzeug für den Job ist? Anders ausgedrückt, wie viel Hässlichkeit sind die Menschen bereit zu ertragen, um zu vermeiden, dass eine integrierte Sprachfunktion für den beabsichtigten Zweck verwendet wird? Meiner Meinung nach ist das Hinzufügen einer Flagge zu teuer, um sie zu bezahlen. Ich mag es, wenn meine Variablen Dinge in den Problem- oder Lösungsbereichen darstellen. "Nur um ein zu vermeiden goto
" schneidet es nicht.
Ich akzeptiere die erste Antwort, die das C-Muster für die Verzweigung zu einem Bereinigungsblock ergab. IMO, dies ist das stärkste Argument für eine goto
der veröffentlichten Antworten, sicherlich wenn Sie es an den Verzerrungen messen, die ein Hasser durchmachen muss, um es zu vermeiden.