"goto"-Anweisung auch entgegengesetzt?



  • Hi Pals,

    gewöhnlich geht die "goto"-Anweisung nach unten. Gibt es sie auch als "Nach-Oben"-Variante?



  • So :

    int main(void)
    {
     int x = 1;
    Anf:
     scanf("%i",&x);
    
     if(x)
       goto Anf;
    
     return 0;
    }
    

    Das geht, aber Goto sollt nicht benutzt werden, weil es den Code
    unleserlich macht und in 99,9 % der Fälle vermieden werden kann.

    [ Dieser Beitrag wurde am 29.04.2003 um 13:05 Uhr von C Newbie editiert. ]



  • Wie C Newbie schon sagte:
    Ein goto sollte eigentlich überall hinspringen können in deinem Quellcode wo du die Marke setzt. Egal ob rauf oder runter.



  • darf es in c variableninitialisierungen bypassen?
    darf es in c in ne andere funktion hüpfen?



  • Genau wegen solcher Fragen (die hoffentlich mit nein beantwortet werden können) sollte man Goto nicht benutzen. Ich schreib seit Jahren Software und habs noch nie gebraucht.

    @Bowser Wie du ja selbst schon mal gesagt hast, "programmierst" du indem du diverse Quellen zusammenschnippelst. Es wäre nun wohl der Zeitpunkt gekommen, wirklich mit Programmieren anzufangen.

    -junix



  • Hi

    also wenn man sich etwas in Assembler auskennt, weiß man dass Sprünge (bzw bedingte sprünge) das einzige Mittel sind um von sequetiellen Ablauf abzuweichen.

    Im endeffekt laufen schleifen,ifs,fors,return-anweisungen etc.. alles auf Sprünge hinaus, wenns man kompiliert ist.

    Aber gerade deshalb weil goto eben cHaos im Programm erzeugen kann, gibt es ja die Abstraktionen.

    Die einzige Anwendung, wo ichs mal verwendet habe war ein einfaches Automaten Programm, wo man immer von zustandsfunktion zu zustandsfunktion sprang.Aber auch hier gibt es viel bessere Lösungen.
    Grüß Flow



  • Original erstellt von volkard:
    darf es in c variableninitialisierungen bypassen?
    darf es in c in ne andere funktion hüpfen?

    Ja. Nein.

    [Goto macht Quelltext übrigens nicht unübersichtlich. Der Programmierer produziert schwer lesbaren Code, weil er goto da verwendet hat, wo ein anderes Sprachmittel angebrachter gewesen wäre.]



  • Lustig finde ich es immer wenn Leute try-chatch als einen Ersatz für goto mißbrauchen 😃 .



  • goto lässt sich nicht nur in 99,9% der Fälle, sondern IMMER vermeiden. wer das nicht glaubt, der schicke mir code mit goto, von dem er glaubt, dass es nicht ohne goto geht! wenn das ganze nicht gerade durch die vielen gotos zu kompliziert ist, kann ich ihm (oder ihr??, 🙂 gerne umschreiben

    cu todo



  • Die Möglichkeit etwas zu vermeiden, ist natürlich ein hervorragender Grund etwas zu vermeiden. Funktionen kann ich vermeiden, darum vermeide ich ab jetzt Funktionen. Danke für den guten Tipp.



  • Sicher geht das, die Frage ist, ist das sinnvoll?



  • Original erstellt von Daniel E.:
    [QB]Funktionen kann ich vermeiden, darum vermeide ich ab jetzt Funktionen.QB]

    Cool, eine 30000-Zeilen-main 😃



  • nee. zusammengehörige anweisungsblöcke werden in ne entsprechende headerdatei verfrachtet und gemakrot oder gegotot.

    hier ein teil der string.h

    :strcpy
    {char* d=p1,s=p2;while(*d++=*s++};}

    aufruf einfach mit
    char buf[10];
    p1=buf;p2="hallo";goto strcpy;

    weicheier verwenden sogar makros:

    //das hier entspicht der alten version mit ner normalen funktion.
    :strcpym
    {char* d=p1,s=p2;while(*d++=*s++};}
    #define strcpy(d,s){p1=d;p2=s;goto strcpy;}

    //und das einer inline-funktion
    #define strcpy(d,s){p1=d;p2=s;while(*p1++=*p2++);}

    damit lassen sich auch alle objektorientierten sprachmitten abbilden, auf die wir ab jetzt auch verzichten sollten, weil es einfacher geht.



  • Ne GOTO's sind schon sinnvoll - aber man sollte die sehr überlegt einsetzten - alles kann man auch ohne GOTO's lösen - jedoch ich der einfachere Weg IMMER vorzuziehen.

    Hier sind 3 verschachtelte Schleifen. Break verlässt nur eine Schleife. Man müsste evtl TMP-Variablen anlegen - das ist schlecht. Und wenn einer tatsächlich eine Funktion extra dafür anlegt, dann soll er mal überlegen was den nun übersichtlicher ist (Funktion muss man ja auch erst suchen usw...)

    for ...
    {

    while ...

    do
    if ..... then goto abbruch
    while ...;

    };

    };

    abbruch:;



  • Naja, im Linux Kernel wird hier und dort mal ein goto verwendet (aus performance gründen...). Aber ich bin auch gegen solche Mittel.

    Fazit: goto darf nur verwenden, wer ein Super Kernel-Hacker ist...



  • Original erstellt von <sucker>:
    Fazit: goto darf nur verwenden, wer ein Super Kernel-Hacker ist...

    Zusatz 1 zu Fazit: Jeder darf goto verwenden, solange goto die beste Möglichkeit darstellt das Problem/ die Lösung auszudrücken und zu implementieren.



  • Original erstellt von <TS>:
    **Hier sind 3 verschachtelte Schleifen. Break verlässt nur eine Schleife. Man müsste evtl TMP-Variablen anlegen - das ist schlecht. Und wenn einer tatsächlich eine Funktion extra dafür anlegt, dann soll er mal überlegen was den nun übersichtlicher ist (Funktion muss man ja auch erst suchen usw...)
    **

    nonsens. die funktion steht genau drüber und ist inline.
    und wer funktionen suchen muß, hat unordnung. gerade der sollte kein goto verwenden.



  • 🙂

    Naja mir ist egal - dann code für jedes Schleifengebilde eine Funktion



  • Wenn die Funktion keinem sinnvollen abstrakten Begriff zugeordnet werden kann, also rein zur Vermeidung des gotos eingeführt wird, halte ich das für ein und dieselbe Kategorie wie alle anderen Mechanismen zum selben Zweck.



  • Original erstellt von Bashar:
    Wenn die Funktion keinem sinnvollen abstrakten Begriff zugeordnet werden kann, also rein zur Vermeidung des gotos eingeführt wird, halte ich das für ein und dieselbe Kategorie wie alle anderen Mechanismen zum selben Zweck.

    jo.
    in c++ kommt mir's nicht vor, daß ein goto zum rausspringen aus schleifen nutwendig wäre. die schleifen sind entweder verschachtelt und laufen dann auch durch oder sind rausspringer, wie die suchschleife, aber die ist ne sinnvolle eigene funktion.
    in c kanns natürlich rausspringer geben, die unten noch ein fclose brauchen, also ist da goto zu nehmen.


Anmelden zum Antworten