Einfache Anfängerfrage zu goto



  • Also für einen der nicht lesen kann/will

    hier eine version welche du wahrscheinlich besser verstehst ( verstehen willst )
    also hier eine version ohne break ( welche du ja nicht willst )

    Bei folgenden Code haftet der Poster nicht für Systemabstürze oder Sonstige Fehler welchen einen Verlust oder Schaden hervorheben können.

    negativ = false;
    for (int i = 0; i < x && negativ == false; i++)
        if (arr[z-1][i] < 0)
        {
            negativ = true;
            // goto weiter; //break reicht nicht
            // und bitte schreib hier nie wieder irgendwas mit goto.
        }
    


  • Es sollte vielleicht erwähnt werden, dass break nur einen Schleifenkörper abbricht. Das bedeutet wenn break in einer verschachtelten Schleife aufgerufen wird, dann werden NICHT alle Schleifen abgebrochen.

    Ein Beispiel um dies zu verdeutlichen:

    for( /*..*/ ) //1. Schleife (kann auch ein 'while' sein)
    {
      for( /*..*/ ) //2. Schleife
      {
        if( /*..*/ )
        {
          break; //Wird diese Zeile ausgeführt...
        }
      }
      //...,dann wird hier fortgesetzt!
    }
    

    Bei switch-Konstrukten in Schleifen tritt ein ähnliches Problem auf:

    for( /*..*/ )
    {
      switch( /*..*/ )
      {
      case x:
        //...
        break; //'switch' konsumiert dieses break. Die Schleife wird NICHT abbgebrochen!
      }
      //Nach dem break geht's hier weiter...
    }
    

    Lösen kann man diese Probleme mit einer einfachen bool-Variable. Man integriert die bool-Variable in die Laufzeitbedingung der Schleife(n) und kann sie somit von überall abbrechen. 😉



  • Aziz schrieb:

    Lösen kann man diese Probleme mit einer einfachen bool-Variable. Man integriert die bool-Variable in die Laufzeitbedingung der Schleife(n) und kann sie somit von überall abbrechen. 😉

    wobei nicht unerwähnt bleiben sollte, daß die goto-lösung der lösung mit der künstlichen variablen immer vorziziehen ist.



  • Hmm, ich dachte 'goto' ist in C++ immer kategorisch abzulehnen... 🙂



  • Aziz schrieb:

    Hmm, ich dachte 'goto' ist in C++ immer kategorisch abzulehnen... 🙂

    die schleife for(int i=0;i!=anzahl;++i) ist eine gute schleife. man sieht klar, von wo bis wo sie geht. warum sie verunstalten zu for(int i=0;!found && i!=anzahl;++i)?
    der befehl goto found; ist ein guter befehl. man sieht sofort, was er macht. er geht zum programmteil, was laufen soll, wenn was gefunden wurde. warum ihn verunstalten zu found=true mit dem verlangen, daß der leser im hinterkopf behalten hat, daß über den umweg der mutierten laufbedingung die bedeutung von "found=true" einfach nur ist "hör mit der schleife auf".

    beim programmieren gilt:
    alle generalisierungen sind falsch.



  • In so einem Fall scheint 'goto' doch die besser Lösung zu sein. Danke für die Belehrung 🙂



  • Danke, Volkard und Aziz, das waren vernünftige Antworten. Habt mir geholfen.



  • In den meisten Fällen ist es noch viel schöner, wenn man die Schleife einfach in eine Funktion auslagert und auf einmal return nehmen kann 🙂



  • operator void schrieb:

    In den meisten Fällen ist es noch viel schöner, wenn man die Schleife einfach in eine Funktion auslagert und auf einmal return nehmen kann 🙂

    jo. wenn man diesen trick gut kann, dann kann man auch wieder sagen "goto ist generell schlecht".

    naja, ganz wenige ausnahmen, die mir aber auch nur alle paar jahre begegnen und die ich dann ganz schnell wieder vergesse.



  • das problem mit der schleife wird man auch schnell los, die kann man ja auch hervorragend mit goto konstruieren..

    😃



  • Hi!

    mata schrieb:

    das problem mit der schleife wird man auch schnell los, die kann man ja auch hervorragend mit goto konstruieren..

    😃

    Ich empfehle dir Assembler. 😉

    Code-Hacker


Anmelden zum Antworten