Spiele Programmier wie funktioniert das?

@krizzelfix: Das ist nicht nur eine Rekursion, sondern auch eine Endlosschleife (ok, vermutlich bis irgendwas wie der Stack überläuft...) (und Schleife is hier eigentlich auch der falsche Ausdruck)
 
@krizzelfix: Natürlich bin ich mir als Softwareentwickler bewusst dass "goto" eine Sünde ist :) Prinzipiell ist es aber immer noch möglich das zu verwenden in C/C++, Pascal, Perl usw.

Meines ist eine nachgebaute do-while Schleife die genau so lange läuft wie i < 10 ist, nicht mehr und nicht weniger.

@claW3581: Von Java (Phyton kenne ich nicht) habe ich ja gar nicht einmal gesprochen. Aber Pascal und Perl unterstützt goto genauso und in PHP gab es erste Überlegungen dies einzubauen. Dafür wurden sogar schon patches entwickelt die goto in PHP erlaubt haben.

Aber ganz davon abgesehen ist deine Aussage "[...] dann glaub ich dir, dass es eine "if-schleife" gibt." nicht ganz überlegt. Nicht jede Programmiersprache untersüttzt alle möglichen Programmierkonzepte. z.B. unterstützt das ursprüngliche Pascal und Basic keine Klassen in dem Sinne und keine Vererbung, trotzdem gibt es dieses Konzepte, eben nur nicht in Basic. (ja ich weiß, selbst die Anfängersprache Visual Basic kennt das heute).

bkausbk
 
Zuletzt bearbeitet:
Und dennoch ändert es nichts daran, dass IF keine Schleife ist.
Man kann Schleifen mit IF-Konstruktionen machen ja, im Grunde basiert jede Schleife auf IFs, aber das ändert nichts daran, dass IF nun mal kein Schleifen-Ausdruck ist.

Du kannst mit IFs Schleifen machen, aber nur mit Hilfe von Sprungbefehlen. Ohne expliziten Sprung ist eine Schleife mit IFs wohl kaum realsiierbar... Eine richtige Schleife braucht keinen Sprungbefehl (natürlich kommt intern nichts anderes als ein IF mit Sprungbefehl zum Einsatz)
 
Zuletzt bearbeitet:
@1668mib: Ups, hatte das nur schnell als beispiel hingeschrieben.
Und wo du das mit Der for-Schleife sagst, ich meine es gibt sogar einen Wettbewerb bei dem Programme/ Algorithmen nur mit for-Schleifen geschrieben werden.
Denke aber, dass es bei großen Programmen einen starken Performance verlust gibt.

@bkausbk: Leider haben es Sprunganweisungen es auch in neue Sprachen wie C# geschafft.
Hätte man meiner Meinung nach auch gut rauslassen können.

Grüße

krizzel
 
Hab das mit der FOR-Schleife wieder rausgenommen, weil es mir doch ein wenig zu umständlich war es mal kurz hier so ungetestet dann zu posten... ich hab vorher gesagt, dass es wohl auch möglich ist statt IF-Ausdrücke zum Vergleich auch FOR zu benutzen... is bestimmt ziemlich umständlich, aber würde wohl gehen :-)

Edit:
Und zu den Spriunganweisungen: Ich bin auch kein Freund davon, und es ist besser man verzichtet darauf, und mir fällt kein Beispiel ein, wo man wirklich auf einen Sprungbefehl angewiesen ist... aber mit Bedacht eingesetzt sind sie eigentlich gar nicht mal so schlimm...
 
1668mib schrieb:
aber mit Bedacht eingesetzt sind sie eigentlich gar nicht mal so schlimm...

Das würd ich so nicht sagen. Stichwort "Intialisierungen überspringen":
Code:
...
goto label:
std::string s = "Hallo Welt"
label:
std::cout << s << std::endl; // autsch!

Aus vielen guten Gründen sollte man die Dinge rigeros niemals ohne jede Ausnahme verwenden.
 
Wieso sollte man da auch ein goto benutzen?!
Wegen so einem blöden Beispiel davon ganz abzuraten ist imo Quatsch. (Ich benutze auch keine gotos (mehr), aber das Beispiel ist imo kein Argument)
 
Es ist auch nur ein Beispiel, das so etwas passieren kann.
Ist klar das in einem richtigen Programm da noch mehr Zweilen kommen.
 
Wer kein GOTO einsetzen will, sollte meiner Meinung nach auch keine BREAK- bzw. CONTINUE-Statements einsetzen... ;)
Folglich hat ein GOTO (bzw. eine kleine Modifikation davon) auch heute noch eine Daseinsberechtigung
 
Eben, break und continue sind auch so Randerscheinungen.

Auf der einen Seite heißt es, man soll Schleifen (innerhalb Funktionen) nicht mit return verlassen sondern entweder break verwenden oder die Schleifenbedingungen anpassen. Letzteres führt zu unnötig komplizierten Ausdrücken und einer Verlangsamung des Programmablaufs. Ersteres ist meist die bessere Wahl. Aber auch hier sollte es optimierte Varianten geben. Gibt es z.b. mehrfach ineinander geschachtelte Schleifen wäre es sinvoll zu sagen wohin break springen soll.

Beispiel:

Code:
[COLOR="Blue"]for[/COLOR] (i = 0; i < 1000; i++) {
    [COLOR="Blue"]for[/COLOR] (j = 0; j < 1000; j++) {
        [COLOR="Blue"]for[/COLOR] (k = 0; k < 1000; k++) {
            [COLOR="Blue"]if[/COLOR] (BerechnungAbgeschlossen()) {
                [COLOR="Blue"]break[/COLOR] 3;
            }
        }
    }
}

D.h. man springt gleich aus den 3 Schleifen-Ebenen heraus. Dies spart nötige Abfragen innerhalb der 2 anderen Schleifen die man benötigen würde wenn man das ganze mit Statusvariablen machen würde.

@7H3 N4C3R: Ja wenn man mit Objekten arbeitet ist ein goto u.U. schon etwas trickreich. Aber ich denke dafür hat man ja seinen Verstand und seine Erfahrung um so etwas auszuchließen. Auch sollte man goto ja wie gesagt nur in äußersten Notfällen oder besser in ganz speziellen Fällen einsetzen (auch wenn mir jetzt keiner einfällt).
 
Zuletzt bearbeitet:
Backslash schrieb:
Wieso sollte man da auch ein goto benutzen?!
Wegen so einem blöden Beispiel davon ganz abzuraten ist imo Quatsch. (Ich benutze auch keine gotos (mehr), aber das Beispiel ist imo kein Argument)

Deshalb ist es auch ein Beispiel. In produktivem Code ist sowas viel viel besser versteckt. :) Und - übersprungene Initialisierungen sind ein knallhartes Argument gegen goto, v.a. in C++, da so u.A. RAII ausgehebelt werden kann, einer der fundamentalsten Grundbausteine.
 
Es reduziert das Problem halt auf das allerwesentlichste. ;) Also Konstruktor/Destruktor überspringen. Jedem der programmieren kann traue ich auch zu, sich daraus ein beliebiges praxisrelevantes Beispiel zu konstruieren. :)

[quote="bkausbk]@7H3 N4C3R: Ja wenn man mit Objekten arbeitet ist ein goto u.U. schon etwas trickreich. Aber ich denke dafür hat man ja seinen Verstand und seine Erfahrung um so etwas auszuchließen. Auch sollte man goto ja wie gesagt nur in äußersten Notfällen oder besser in ganz speziellen Fällen einsetzen (auch wenn mir jetzt keiner einfällt).[/quote]
Mein Verstand und meine Erfahrung sagt mir es nie zu benutzen. :) Jedes Goto lässt sich durch eine entsprechende Kontrollstruktur ersetzen. Im Gegensatz zu continue und break kann goto über Blockgrenzen hinwegspringen, was zumindest der Natur von C und C++ und dem damit verbundenen Programmfluss völlig widersprüchlich ist und die Semantik der Sprache gefährdet. Wenn man an den Grundfesten von C/C++ rüttelt, braucht man sich nicht zu wundern wenn man sich auf die Sprache nicht mehr verlassen kann.
 
Zuletzt bearbeitet:
Wenn ich mir jetzt überlege wo ich goto das letzte Mal eingesetzt habe, da fällt mir nur Systemnahe Programmierung ein.

Genauer gesagt vor ca. 4 - 5 Jahren als ich mich noch mit Betriebssystemprogrammierung befasst habe. Dort kann ein goto manchmal ganz nützlich sein um systemnah ohne Assembler programmieren zu können. Nicht das ich keine Ahnung von Assembler hätte, aber es bringt den Code ziemlich durcheinander wenn man Assembler und C mischt.

Auch wenn das Papier von Knuth schon ein paar Jährchen auf dem Buckel hat, stimme ich dem grundsätzlich auch zu. Wenn ich das richtig herausgelesen habe, verzichtet er selber jetzt auch wenn möglich auf direkte Sprünge mit goto, jedoch hat er diesen Kontrollbefehl nicht verteufelt und sieht auch deren Vorteile vorallem was Performance betrifft und eben auch teils die Wartbarkeit erhöhen kann.

Wir sind eigentlich total Off-Topic hier, vielleicht sollte man das in ein neues Thema splitten.
 
Zuletzt bearbeitet: (Off-Topic)
Man kann auch mit malloc unvernünftige Dinge machen, und dennoch gibt es keinen Grund, sowas aus C++ rauszunehmen.

Wie gesagt: Es kann durchaus mal Fälle geben, wo ein GOTO gar nicht mal so verkehrt ist, mir fällt auch keiner ein, und man sollte nicht bei jeder Banalität ein GOTO verwenden, weil das wirklich unfug ist.

Ich selbst bin auch eher ein Gegner von GOTOs, aber ich sehe dennoch keinen Grund sie zu entfernen...
aber das ist ja echt ein anderes Thema...
 
Nachträglich sachen aus einer Programmiersprache zu entfernen, finde ich auch bescheuert.
Aber in neueren Sprachen wie C#, hätte man goto rauslassen können.
Ich denke das es viele Programmieranfänger dazu verleitet goto zu benutzen.

Grüße

krizzel
 
"GOTO" is meiner Meinung nach n guter Ersatz von Schleifen in verbindung mit "if" ;)
 
Zurück
Oben