GOTO ist nicht langsam



  • da es grundsätzlich schlechter Stil ist

    Nö isses nicht.

    close thread



  • peterchen schrieb:

    da es grundsätzlich schlechter Stil ist

    Nö isses nicht.

    Doch.

    ~Thread Closed~



  • Mahlzeit schrieb:

    peterchen schrieb:

    da es grundsätzlich schlechter Stil ist

    Nö isses nicht.

    Doch.

    Ja, lieber irgendwas basteln, was das selbe macht, 3 keywords mehr braucht und unlogischer ist. Hauptsache man hat ein goto vermieden. Blödsinn! gotos vermeidet man in den meisten Fällen durch nachdenken, nicht durch Flags. In den anderen kann man es IMHO nehmen, wenn es das logischste ist.



  • Mahlzeit schrieb:

    GotoLover schrieb:

    ...
    ...
    while(a)
    {
       while(c)
       {
          while(d)
          {
              if (e)
                 goto fertig;
          }
       }
    }
    fertig:
    ...
    ...
    

    oder so:

    ...
    ...
    while(a && c && dd && !e)
    {
    }
    ...
    

    und jetzt?

    ...
    ...
    for(a; ...)
    {
       while(c)
       {
          for(d; ...)
          {
              if (e)
                 goto fertig;
          }
       }
    }
    fertig:
    ...
    ...
    


  • Mahlzeit schrieb:

    peterchen schrieb:

    @Mahlzeit, cico2005:
    hä?

    Man sollte davon ausgehen, das a,c,d,e komplexere Bedingungen sind, die sich inner halb der jeweiligen Blöcke ändern.

    Dann schreib es genauer hin und ich ändere es dir entsprechend. Im Moment ersetzt mein Code deinen exakt. Ich kann ja nicht ahnen, was du dir noch dazudenkst. Was du dir auch immer ausdenkst, es wird immer ohne goto gehen.

    Ich kann mich nur Mahlzeit anschließen...Ich würde goto nie verwenden,weil der Code sehr unübersichtlich wird.Zudem muß jeder selber wissen wie er progged.
    Ich denke in einem größeren Projekt z.b.in einer Firma wirst du mit deinem goto eher auf Ablehnung stoßen.



  • Zudem wär jetzt ein "break" nicht schlecht...Weil sich hier sowieso nur alles wiederholt.Lasst doch den goto Usern ihr goto.Ist doch total lächerlig die Diskusion über goto...



  • GotoLover schrieb:

    und jetzt?

    ...
    ...
    for(a; ...)
    {
       while(c)
       {
          for(d; ...)
          {
              if (e)
                 goto fertig;
          }
       }
    }
    fertig:
    ...
    ...
    
    void foo()
    {
        for(a; ...)
        {
           while(c)
           {
              for(d; ...)
              {
                  if (e)
                     return;
              }
           }
        }
    }
    ...
    
    ...
    ...
    foo()
    ...
    ...
    


  • troll28 schrieb:

    void foo()
    {
        for(a; ...)
        {
           while(c)
           {
              for(d; ...)
              {
                  if (e)
                     return;
              }
           }
        }
    }
    

    nicht foo, sondern

    ThisFuckingFunctionOnlyExistsBecauseIAmABloodyLamerWhoAvoidsGotoEvenIfItsUseful()
    


  • oder auch

    void pwned()
    


  • cico2005 schrieb:

    Ich würde goto nie verwenden,weil der Code sehr unübersichtlich wird.

    Kannst du dich noch erinnern wem genau du das nachgeplappert hast? Man kann dies nicht verallgemeinern. So etwas z.B. sehe ich oft und finde es lächerlich...

    for(unsigned i = 0; i != sizex && !stop; ++i)
    {
      for(unsigned j = 0; j != sizey; ++j)
      {
        if(foo(i, j))
        {
          stop = true;
          break;
        }
      }
    }
    

    Noch besser als ein goto wäre es hier natürlich den inneren Code (falls sinnvoll trennbar) in eine Funktion auszulagern und sich den ganzen Mist zu schenken...



  • Um nochmal auf den Ausgangspunkt der Diskussion zurück zukommen. Wer hat
    eigentlich behauptet, bzw. wo steht, das GOTO langsam sei. 😕



  • Walli schrieb:

    Noch besser als ein goto wäre es hier natürlich den inneren Code (falls sinnvoll trennbar) in eine Funktion auszulagern und sich den ganzen Mist zu schenken...

    Wobei unklar bleibt, ob es sinnvoll ist fünf returns in einer Hilfsfunktion zu halten; wenn man die Funktion nicht versteht, dann artet das auch in einem auf den ersten Blick verwirrenden Programmfluß aus wie bei goto. So ganz unrecht hatte die ein-Funktionseingang-ein-Funktionsausgang-Fraktion nämlich nicht, auch wenn das Verdammen von break und continue dann wohl doch ein *bißchen* übertrieben ist.



  • @cico:
    hast du echte Erfahrungen damit, oder hast du's nur gehört?

    Ich hab genug schlechten code ohne goto gesehen, daß ich goto-Freiheit nicht zum heiligen Gral erklären würde. Für mich stehen Verständlichkeit und Pflegbarkeit an erster Stelle, die Mechanismen die üblicherweise dahin führen erst an zweiter.

    Für die Freunde der wohlstrukturierten Programmierung ohne goto erinnere ich an Duff's Device:

    send(to, from, count)
    	register short *to, *from;
    	register count;
    	{
    		register n=(count+7)/8;
    		switch(count%8){
    		case 0:	do{	*to = *from++;
    		case 7:		*to = *from++;
    		case 6:		*to = *from++;
    		case 5:		*to = *from++;
    		case 4:		*to = *from++;
    		case 3:		*to = *from++;
    		case 2:		*to = *from++;
    		case 1:		*to = *from++;
    			} while(--n>0);
    		}
    	}
    


  • gelöscht - doppelpost



  • GotoLover schrieb:

    troll28 schrieb:

    void foo()
    {
        for(a; ...)
        {
           while(c)
           {
              for(d; ...)
              {
                  if (e)
                     return;
              }
           }
        }
    }
    

    nicht foo, sondern

    ThisFuckingFunctionOnlyExistsBecauseIAmABloodyLamerWhoAvoidsGotoEvenIfItsUseful()
    

    Schon mal was von static gehört?



  • Irgendwer schrieb:

    Schon mal was von static gehört?

    static void ThisFuckingFunctionOnlyExistsBecauseIAmABloodyLamerWhoAvoidsGotoEvenIfItIsUseful()
    


  • Daniel E. schrieb:

    Walli schrieb:

    Noch besser als ein goto wäre es hier natürlich den inneren Code (falls sinnvoll trennbar) in eine Funktion auszulagern und sich den ganzen Mist zu schenken...

    Wobei unklar bleibt, ob es sinnvoll ist fünf returns in einer Hilfsfunktion zu halten; wenn man die Funktion nicht versteht, dann artet das auch in einem auf den ersten Blick verwirrenden Programmfluß aus wie bei goto.

    Genau deswegen schrieb ich ja "falls sinnvoll trennbar".

    Meist hilft es ein wenig über das gegebene Problem nachzudenken, wenn man seinen Code sauber strukturieren will. Und nachdenken heißt auch, nicht alles sofort zu verteufeln, bloß weil jemand vor zig Jahren mal was von "goto ist Böse" erzählt hat, dabei eigentlich aber ein ganz anderes goto als das in C meinte. Natürlich ist goto böse. Goto ist genauso böse wie Pointer, Casts und Makros. Mit fast allem kann man in C Blödsinn machen.
    Um das klarzustellen: Ich bin nicht der neue "Ritter des goto", aber diese Lehrbuch-Generalisierung "goto ist schlechter Stil" finde ich mindestens genauso bescheuert wie den unüberlegten Einsatz.
    Aber als Faustregel kann man IMO schon stehen lassen, dass sich jemand, der mehr als ein goto auf ~10000 LOC braucht Gedanken um seinen Stil machen sollte.



  • Da ich bei meine Code sehr viel mit hardwarenaher Steuerung und Messwerterfassung unter Echtzeitbedingungen zu tun habe, bin ich auch zwar der Auffassung das man auf das goto verzichten sollte so weit es irgendwie geht, es aber immer wieder Situationen gibt in dem das goto z.B. als Fehlerausprung mit dedizierter Fehlerbehandlung besser ist als multiple returns oder tonnenweise if´s mit if errorflag break.

    Das wichtigste ist ein klar strukturierter, gut lesbarer und wartbarer Algorithmus und Code. Wie dies erreicht wird ist nicht nur zweit sondern eher drittrangig.

    ➡ Um das Flamen noch ein bisschen anzuheizen:
    Selbst C++ kommt nicht ohne aus, es hat dem ganzen nur einen schöneren Namen gegeben Der Try - Throw - Catch ist nicht anderes als eine erweitertes und sehr viel leistungsfähigeres "goto" 🕶



  • PAD schrieb:

    Selbst C++ kommt nicht ohne aus, es hat dem ganzen nur einen schöneren Namen gegeben Der Try - Throw - Catch ist nicht anderes als eine erweitertes und sehr viel leistungsfähigeres "goto" 🕶

    in c heisst das 'longjmp' bzw. 'setjmp'. ansonsten 'full ack'



  • Nicht ganz 'longjmp' bzw. 'setjmp' springen quer durchs Programm ohne Rücksicht auf Stack,heap etc.

    Try - Throw - Catch geht durch die Routinen zurück und räumt auf. Mit einem goto zum routinenende und
    einem errorcode im returnwert könnte man ähnliches errichen.


Anmelden zum Antworten