C++ Goto - Von Sprungmarke "zurückkehren"?



  • SeppJ schrieb:

    Arbeit verweigern. Oder auf INTERCAL als Sprache bestehen. Das kennt das schöne Schlüsselwort "COME FROM".

    Hahaah, INTERCAL war sogar mir neu. Spielt in der Liga von Brainfuck mit.



  • Nein man braucht auch kein goto, eigentlich braucht man nicht mal mehr wirklich Programmiersprachen, weil man sich mittlerweile alles schön zusammen klicken kann.

    Aber wo besteht denn jetzt das Problem, wenn das irgendjemand für sich trotzdem so machen will?


  • Mod

    Freunde lassen Freunde kein goto benutzen.



  • Ganz schöne Bevormundung irgendwie....



  • HansKlaus schrieb:

    Ganz schöne Bevormundung irgendwie....

    Niemand wird gezwungen sich an die Aussagen im Forum zu halten, dennoch ist es unsinnig jemanden Bad-Practice beizubringen. In sofern gibt es eine gewisse Bevormundung: Man versucht keinen schlechten Code zu unterstützen. Das Forum soll helfen, nicht schaden (und eine schlechte Angewohnheit wird man selten wieder schnell los).


  • Mod

    HansKlaus schrieb:

    Aber wo besteht denn jetzt das Problem, wenn das irgendjemand für sich trotzdem so machen will?

    Erste Regel des Goto-Clubs: benutze nie goto . Zweite Regel des Goto-Clubs: benutze nie goto !



  • Hm. Wenn man sich mal zum Beispiel den Code von systemctl anguckt (https://github.com/systemd/systemd/blob/master/src/systemctl/systemctl.c), wird man dort viele gotos finden und ich finde den Code dadurch nicht unbedingt unübersichtlich. Gut, das ist C ohne ++ und mit ++ könnte man die Ressourcen anders verwalten.

    Aber ich dachte, dieses komplette goto-Verbot wäre inzwischen überholt und man kann goto schon einsetzen, sollte dies aber nur sehr überlegt tun.

    Die Frage ist aber eigentlich hier eine andere: Gast1 schrieb "Funktionen [...] nicht gestattet.". Spannend ist doch: warum sind Funktionen verboten? Ist das eine Übungsaufgabe zu goto?


  • Mod

    Naja, der Code dort ist nicht unbedingt unübersichtlich, aber er wäre auch nicht weniger übersichtlich wenn e.g. list_sockets nicht 75 Zeilen lang wäre. Spaltet man die Funktion entsprechend auf, erübrigen sich auch die goto s.



  • Spannend ist doch: warum sind Funktionen verboten? Ist das eine Übungsaufgabe zu goto?

    Man kann es nur hoffen.

    Aber der Pessimist in mir befürchtet mal wieder eine Optimierungsfrage aufgrund von Halbwissen. Funktionsaufrufe sind ja eine teuere Angelegenheit und wenn dann jemand inline Funktion und Makros nicht kennt, könnte man ja auf die Idee kommen und Funktionen in zeitkritischen Bereichen verbieten.



  • hustbaer schrieb:

    Nein, du brauchst nie goto (in Sinne von: goto ist nie notwendig/unumgänglich).

    Was ist schon unumgänglich? Kannst ja alles in Binärcode programmieren, dann brauchst du nicht mal eine Programmiersprache. goto kann in ausgewählten Situationen die beste Lösung sein. Beispiel entfällt, kein' Bock rumzustreiten.


  • Mod

    versionsnummer schrieb:

    hustbaer schrieb:

    Nein, du brauchst nie goto (in Sinne von: goto ist nie notwendig/unumgänglich).

    Was ist schon unumgänglich? Kannst ja alles in Binärcode programmieren, dann brauchst du nicht mal eine Programmiersprache. goto kann in ausgewählten Situationen die beste Lösung sein. Beispiel entfällt, kein' Bock rumzustreiten.

    Das sind aber meistens recht konstruierte Situationen, in denen goto ein bisschen besser ist als die strukturierte Vorgehensweise. Im Gegensatz zu Regelfall, in dem goto sehr viel schlechter ist.



  • goto gehört zum C++ Sprachkonstrukt also ist es legitim es zu benutzen. Ich verstehe nicht weshalb man alles schlecht reden muss und zur Lösung trägt es auch nicht bei.



  • manni66 schrieb:

    goto gehört zum C++ Sprachkonstrukt also ist es legitim es zu benutzen. Ich verstehe nicht weshalb man alles schlecht reden muss und zur Lösung trägt es auch nicht bei.

    Welche Schnapsnase kann sich denn da keinen Namen ausdenken?



  • HansKlaus schrieb:

    da kann man mal sehen, was bei dem ständigen "kein goto benutzeneinself" rauskommt: die leute können nicht mal mehr goto benutzen. 🙄

    eine möglichkeit wäre jedenfalls

    goto unterprogramm;
    rueckkehr_von_unterprogramm:
    //mach was
    
    unterprogramm:
    //mach was
    goto rueckkehr_von_unterprogramm;
    

    Sorry, ich habe nicht den ganzen Thread gelsesen, aber muss im Moment verspätet unbedingt was zu schreiben 😉
    Die obige Konstruktion ist das gute alte GOSUB aus dem guten alten Commodore Basic 2.0. Nur das damals noch mit Zeilennummern gearbeitet wurde.

    Aber schon damals hat man versucht, GOTO irgendwie zu umgehen.



  • versionsnummer schrieb:

    hustbaer schrieb:

    Nein, du brauchst nie goto (in Sinne von: goto ist nie notwendig/unumgänglich).

    Was ist schon unumgänglich? Kannst ja alles in Binärcode programmieren, dann brauchst du nicht mal eine Programmiersprache. goto kann in ausgewählten Situationen die beste Lösung sein. Beispiel entfällt, kein' Bock rumzustreiten.

    Aber anscheinend genug Bock einen vollkommen sinnfreien Beitrag an mich zu schreiben.
    Aber auch dir erkläre ich es nochmal: Wenn der OP schreibt dass er "von goto zurückspringen" will, dann hat er mit an Sicherheit grenzender Wahrscheinlichkeit keinen solchen Fall wo goto die beste Lösung ist.

    ps:
    Der Schaden der durch goto angerichtet wird ist nach meiner Einschätzung um mehrere Grössenordnungen grösser als der der durch die Vermeidung von goto angerichtet wird. Und je öfter man ein bestimmtes Konstrukt, das in einigen wenigen Ausnahmefällen angebracht sein kann, irgendwo verteidigt, desto öfter wird es angewendet werden. Und zwar - leider - überall, und nicht nur in den wenigen Ausnahmefällen. Weil bei den goto-Verwendern schlussendlich bloss "goto ist eh nicht so übel" hängen bleibt - die Einschränkung auf einige wenige Spezialfälle wird da gerne einfach "vergessen".

    pps: Dass ich mich hier nur auf C++ beziehe sollte hoffentlich klar sein. Bei C gibt es vermutlich deutlich mehr Fälle wo goto unterm Strich die beste Lösung ist. Cleanup Code z.B.



  • lemon03 schrieb:

    HansKlaus schrieb:

    da kann man mal sehen, was bei dem ständigen "kein goto benutzeneinself" rauskommt: die leute können nicht mal mehr goto benutzen. 🙄

    eine möglichkeit wäre jedenfalls

    goto unterprogramm;
    rueckkehr_von_unterprogramm:
    //mach was
    
    unterprogramm:
    //mach was
    goto rueckkehr_von_unterprogramm;
    

    Sorry, ich habe nicht den ganzen Thread gelsesen, aber muss im Moment verspätet unbedingt was zu schreiben 😉
    Die obige Konstruktion ist das gute alte GOSUB aus dem guten alten Commodore Basic 2.0. Nur das damals noch mit Zeilennummern gearbeitet wurde.

    Aber schon damals hat man versucht, GOTO irgendwie zu umgehen.

    Ne ne ne,
    GOSUB hatte den Vorteil, dass es nach dem Beenden der Subroutine zum Aufrufsort zurückkehrte und nicht (wie bei deinem Konstrukt) zu einer festen Zeile.

    Das war eine Art Funktion mit globalen Variablen. Gruselig.



  • manni66 schrieb:

    goto gehört zum C++ Sprachkonstrukt also ist es legitim es zu benutzen...

    Legitim heißt aber nicht sinnvoll. C++ hat viele Altlasten, alleine schon der weitgehenden C-Kompatibilität geschuldet. Neuere Sprachen kennen goto häufig nicht mehr, oder nur in sehr eingeschränkten Kontext (bei C# z.B. um switch-Blöcke zu verbinden).

    Ich wiederhole mich ungern: Aber die, die hier im Forum versuchen zu helfen, versuchen in der Regel Leute von einem schlechten Codestil abzuhalten. Das heißt nicht, das man nicht dennoch Spaghetti-Programmierung betreiben kann oder es extrem seltene Ausnahmefälle geben mag (Aus über 15 jähriger Berufserfahrung kenne ich unter C++ aber nicht einen einzigen Fall bei dem dies zutrifft - ALLE Fälle in den ich mit goto-Code arbeiten musste haben Probleme verursacht und wurden von mir umgestellt - "merkwürdigerweise" lief es dann auch fehlerfrei).

    Aber keiner wird Tipps zu abstrusen, häufig konstruierten Sonderfällen abgeben, da hier auch Unerfahrene lesen und sich dann etwas angewöhnen das man so schlicht nicht macht.



  • asc schrieb:

    Aber keiner wird Tipps zu abstrusen, häufig konstruierten Sonderfällen abgeben, da hier auch Unerfahrene lesen und sich dann etwas angewöhnen das man so schlicht nicht macht.

    Sehr gut auf den Punkt gebracht 👍


Anmelden zum Antworten