Kann "goto" wieder "in" werden?



  • ich hab auch nichts gegen goto, versuche aber es nur zu benutzen wenn es nicht anders geht (z.b. zeikritische routinen).
    hab die erfahrung gemacht, das die meisten leute die gegen goto wettern nicht erklären können warum sie dagegen sind. die haben es dann meistens nur gehört oder gelesen und verbreiten es weiter um mit "fachwissen" zu glänzen (ähnlich wie das verpönte root-arbeiten unter linux). 😉



  • Original erstellt von tenim:
    ich hab auch nichts gegen goto, versuche aber es nur zu benutzen wenn es nicht anders geht (z.b. zeikritische routinen).
    hab die erfahrung gemacht, das die meisten leute die gegen goto wettern nicht erklären können warum sie dagegen sind. die haben es dann meistens nur gehört oder gelesen und verbreiten es weiter um mit "fachwissen" zu glänzen (ähnlich wie das verpönte root-arbeiten unter linux). 😉

    spagetie code, was soll man da noch viel argumentieren?



  • Original erstellt von Dimah:
    spagetie code, was soll man da noch viel argumentieren?

    Du weißt aber hoffentlich, daß dieser Spaghetti-Code in einer Zeit entstanden ist, als man kaum Möglichkeiten hatte Funktionen mit lokalen Variablen zu erstellen?

    Wenn heute jemand in einer 20 Zeilen langen Funktion mitten in einer Schleife mit return (also einem "goto lastline") rausspringt, so sehe ich da keinen Spaghetti-Code...

    Btw, eine Exception in C++ ist auch nur eine Art goto... übrigens kann man Exception-Handling auf Funktionsebene (für Fehlerhandling) sehr schön durch goto ersetzen.



  • spaghetticode ist nur eine mögliche auswirkung und auch nur wenn man goto exessiv benutzt. ich gehe von einmaliger nutzung im notfall aus. 😉



  • int i = 1;
    for (;i < 1000000, array[i] != 'A' ; ++i) ;
    

    wann wird sich endlich rumgesprochen haben, wie der 'op,' funktioniert?
    hier ist ein && gemeint, sonst wirds wohl irgendwann ne schutzverletzung geben.

    edit: zum thema: ich hatte noch nie wirklich das beduerfnis, ein goto zu verwenden. koennts mir hoechstens vorstellen, wenn man aus einer inneren schleife raushuepfen will. aber meist tut man eh die suche oder was immer diese beiden schleifen tun in eine extra funktion, und dann tuts auch ein return.

    [ Dieser Beitrag wurde am 02.12.2002 um 14:20 Uhr von PeterTheMaster editiert. ]



  • Im Assembler-Code und später Maschinencode werden doch sowieso gotos verwendet, ausserdem lässt sich leicht beweisen, dass man mit gotos dasselbe machen kann wie mit while oder loop-Schleifen.
    Es sieht ohne zwar besser aus, kann aber manchmal ohne auch etwas lästig sein !



  • @Snakey:

    Man vermeidet goto nicht, wie du zu glauben scheinst, weil es zuwenig kann, sondern weil es zuviel kann.



  • Original erstellt von PeterTheMaster:
    aber meist tut man eh die suche oder was immer diese beiden schleifen tun in eine extra funktion, und dann tuts auch ein return.

    Sicherlich, aber genau das ist (für C- und C++-Entwickler) der interessante Punkt:

    Wer sowas schreibt:

    void func()
    {
       for (...)
       {
          if (something)
             return;
          ...
       }
    }
    

    verwendet ein goto. Daran beißt die Maus keinen Faden ab:

    void func()
    {
       for (...)
       {
          if (something)
             goto endmark;
          ...
       }
    endmark:
    }
    

    Ist ja auch ok - das bringt oftmals Performance und ist typischer und akzeptierter C-Stil.

    Lustig wird's nur dann, wenn jemand return in Schleifen (oder break) verwendet, aber gleichzeitig zum Kreuzzug gegen goto ausreitet. 😉



  • das ist aber das Problem, dass sich die Sprungmarke auch überschneiden könnte, was beim compilieren zu merkwürdigen Fehlermeldungen führen kann 😞



  • Das Problem beim goto ist aber nicht die Anwendung die einem break, return oder continue entspricht, welche sich darauf beschränkt, ein paar Zeilen im strukturierten Code zu überspringen (also zur weiter runter im Aufrufstack zu gehn), sondern dass ich mit goto irgendwohin an ne ganz andere Stelle im Code in ner ganz anderen Funktion springen kann. Hier wird der Programmfluss, wie er lt. strukturiertem Programmierparadigma sein sollte, völlig unterlaufen. Noch nicht mal mit nem throw kann ich komplett woanders hinspringen.

    Klar, wenn ich vorsichtig damit bin, kann ich goto in diesen Fällen einsetzen. Aber ein return garantiert mir halt, dass ich ans Ende der Funktion springe und von da aus in die aufrufende Funktion zurückkehre, wo sicher aller lokalen Variablen initialisiert sind, und nicht versehentlich sonstwohin.

    Man kann auch mit ner strukturieren Programmiersprache objektorientiert programmieren. Aber warum sollte man nicht gleich die Sprachmittel einer objektorientierten Sprache nehmen? Dasselbe ist mit goto. Klar kann man ganz ohne Funktionen funktional programmieren und mit gotos rumstpringen. Aber warum?
    Außer wenns um wirklich hochoptimierten Code geht, wird man ein goto in einem C/C++-Programm immer und ohne Verrenkungen durch was anderes ersetzen können. Wenn nicht, siehts mir schwer nach nem Design-Fehler aus. Aber natürlich lässt sich jede Regel durch eine Ausnahme bestätigen.



  • while if for etc. sind doch sowieso nur spezialisierungen von gotos. wenn man solche spezialisierungen schon hat dann sollte man sie auch benutzen.. aber sobald man dadurch einen murks erzeugen muss sollte man die benutzung von sochen höheren konstrukten nicht erzwingen...



  • Original erstellt von kartoffelsack:
    sondern dass ich mit goto irgendwohin an ne ganz andere Stelle im Code in ner ganz anderen Funktion springen kann.

    In BASIC vielleicht...

    Das ist doch der Gag, das Goto von dem im Zusammenhang mit dem berüchtigten Spaghetti-Code die Rede ist (Sprünge an beliebige Programmzeilen innerhalb des gesamten Codekomplexes) hat mit dem Schlüsselwort goto der Sprachen C und C++ nur geringe Gemeinsamkeiten. Deswegen ist die Anführung von Argumenten gegen das BASIC-Goto im Zusammenhang mit dem C-goto nur mäßig sinnvoll.



  • @marc++us

    Wenn das so ist, nehm ich alles zurück und behaupte das Gegenteil. Hab mich leider nie mit dem C/C++-goto beschäftigt und pauschal mein wissen aus anderen Sprachen drauf angewendet. 🙄

    Wieder was gelernt 😉



  • Original erstellt von Marc++us:
    **```cpp
    [...]if (something)
    goto endmark;
    ...
    }
    endmark:
    }

    
      
      
    Ist ja auch ok - das bringt oftmals Performance und ist typischer und akzeptierter C-Stil.**
    

    Naja, akzektiert wird's wenn Du einen Befehl, z.B. ';' nach 'endmark:' plazierst :). Aber sonst ein schönes Anwendungsbeispiel für goto.

    Das einzige Problem im Zusammenhang mit der Verwendung von goto ist, dass es das formale Verifizieren von Programmen schwierig (oder unmöglich?) macht. Das sollte aber in der Praxis kein Problem sein :).

    Kartoffelsack: Natürlich _braucht_ man kein goto. Man kann sogar beweisen, dass man es nicht braucht. Das sagt über den praktischen Nutzen ziemlich nichts aus.

    [ Dieser Beitrag wurde am 02.12.2002 um 19:50 Uhr von Daniel E. editiert. ]



  • Hat eine Turing-Maschine goto? Eben.



  • Wer spricht von Turing-Maschinen? Eben.



  • ´´



  • Du. Implizit.



  • 😃 An Turing-Máschinen mußte ich schon denken, als Gregor postuliert hat, eine Programmiersprache müsse nur abstrakt genug sein, dann brauche sie auch keine Plattform.



  • GoTo End

    Das GoTo ist ein Verstoß gegen die strukturierte Programmierung.

    Lt. dieser hat ein Programm(teil) genau einen eingan und einen Ausgang.
    mit dem Goto ist ein solcher Progammteil jedoch unwirksam, da man überall hin springen kann.

    Das GoTo bewegt den ProgramPointer genau an die Stelle, wo man ihn haben will.
    Es gibt dabei keinen eindeutigen Weg mehr zurück!

    Der Call in Funktionen merkt sich auf dme Stack die Adresse, von der aus die Funktion aufgerufen wurde. Nach der Abarbeitung der Funktion wird zurück gesprungen.

    Soviel zum Bekannten.
    Man kann sich nun denken, was passiert, wenn man ausversehen mal ein goto falsch setzt. Es kommt zu Endlosschleifen, völlig wirrsinnigen Daten und unnötigen Programmabstürzen.

    Außerdem: Weiß jemand, wie aufwendig es ist, Code zu verstehen, der nur aus GoTo's besteht? Ich möchte so ein Programm nicht warten müssen oder noch einmal anfassen, nach dem ich selbst es ein halbes Jahr zuvor geschrieben habe..

    cYa
    DjR

    End:


Anmelden zum Antworten