C++ ist eigentlich eine schöne Sprache, nur...
-
blöd, dass man mit break immer nur aus der innersten Schleife springen kann!
Bei einschlägigen Scriptsprache, wie PHP, ist es möglich, hinter break noch die "Tiefe" des Sprunges anzugeben.while(true) while(true) break 2; // springt aus beiden schleifenTja, das vermisse ich manchmal!
-
C++ Möger schrieb:
blöd, dass man mit break immer nur aus der innersten Schleife springen kann!
Bei einschlägigen Scriptsprache, wie PHP, ist es möglich, hinter break noch die "Tiefe" des Sprunges anzugeben.while(true) while(true) break 2; // springt aus beiden schleifenTja, das vermisse ich manchmal!
Kennste goto ? Nimm goto

-
naaaja, ich bin nicht einer von diesen goto hassern der gleich eine shotgun rausholt und dem programmiere ins gesicht schießt wenn ich ein goto im code sehe
es gibt sehr sehr seltene anwendungsfälle bei gewisser if else logik wo ein goto die bessere lösung ist im vergleich zu einer unnötig komplizierten und unverständlichen ohne-goto variante
aber sowas gehört imo nicht zu den fällen wo goto angebracht ist denke ich
vielleicht solltest du deinen entwurf erstmal überdenken ob es so wirklich gut gelöst ist wenn du über eine größere tiefe als 1 breaken willst
ich vermute mal du musst nur 2 schleifen in die tiefe breaken, da würde eigentlich auch ein bool flag reichen und vermutlich auch die leserlichkeit und verständlichkeit fördernaber wenn du meinst es geht wirklich nicht anders nimmt halt ein lokales goto welches innerhalb eines kleinen codestücks die sprungmarke hat so dass es überschaubar bleibt, allerdings musst du dir halt überlegen ob es das ist was du wirklich brauchst
-
Ich bin noch ein Urgestein.
Ich bin damals auf dem Brotkasten (C64) nur so mit goto und gosub umhergehüpft.
Mir ist es zum Anfang als ich Bekanntschaft mit C++ machte auch schwer gefallen, auf sowas zu verzichten.
Heute bin ich der festen Überzeugung, das es für "goto" unter C++ immer eine bessere Lösung gibt. Wenn einem auf Anhieb keine andere Lösung ins Gesicht springt, dann sollte man diese Punkte, die zu dieser falschen Annahme führen versuchen auszumerzen.
Heisst also, ein goto ist immer ersetzbar.
-
Dann sag mir mal, was der Unterschied zwischen dem verlangten
while(true) while(true) break 2; // springt aus beiden schleifenund
while(true) while(true) goto endOfLoops; endOfLoops:ist.
Ein Flag hingegen finde ich unlesbarer.
Imho ist goto gerade für das springen aus mehreren Schleifen geeignet.
-
Imho ist goto gerade für das springen aus mehreren Schleifen geeignet.
Da bist du nicht alleine da mit dieser Meinung.
-
1. Man verwendet so eingentlich nie ein
while(true)Weil irgendwann hat alles ein Ende.
2.Warum ist ein Flag schwerer zu lesen ? Das ist Aufgabe des Programmierers für vernünftige Dokumentation des Codes zu sorgen.
-
Die beste Dokumentation eines Codes ist ein selbstdokumentierender Code.
Code den ich erklären muss is nicht wirklich gut und ein goto endOfLoops Ist leicht zu lesen und zu verstehen, das setzen des Flags alleine auch, nur dass sofort abgebrochen wird und nicht erst am Ende des Schleifendurchlaufes kann und wird einiges an unnötig verkomplizierenden Code verursachen.
Das while(true) war nur aus dem Beispiel oben entnommen, generell braucht man selten einen Abbruch in der Schleife, meistens tuts die Bedingung. Noch seltener muss man gleich 2 Schleifen abbrechen und man sollte sich überlegen ob man das wirklich tun muss.
Aber wenn man es tut, nicht tricksen, goto hat hier keinen der üblichen goto Nachteile, den jede andere Art des Abbruchs nicht auch hätte.
-
Ein goto hat immer den Nachteil, das du dir damit Spaghetti erzeugst.
Egal wie du ihn anwendest.
Ein Flag erzeugt das nicht, du kannst den Ablauf auch bei selbstdokumentierenden Code leichter nachverfolgen.
-
Der Nachteil von Spaghetticode, ist dass er schwer nachzuvollziehen ist und das ist in diesem Fall nicht gegeben.
-
Benutzername: schrieb:
Der Nachteil von Spaghetticode, ist dass er schwer nachzuvollziehen ist und das ist in diesem Fall nicht gegeben.
In welchem Fall ? Bei den genannten Beispielen ?

-
Beim ausstieg aus einer geschachtelten Schleife.
-
Wie wäre es mal mit einem anständigen Programmierstil? PHP ist eine Frickelsprache und kann als Vorbild nicht herhalten. Die ganze Diskussion break, break mit Zahl, goto usw. ist überflüssig, wenn man gescheite, vernünftige, kleine Funktionen schreibt.
Mir ist schon oft aufgefallen, dass die ganzen Diskussionen über Kontrolstrukturen nur von Leuten geführt werden, die riesige Funktionen schreiben. Wer ordentlich programmiert, braucht solche "Features" nicht.
-
Ein goto erzeugt wie schon gesagt immer Spaghetticode.
Du springst aus deinem nachvollziehbaren Ablauf an eine andere komplett andere Stelle des Programms.
Und je umfangreicher und verschachteleter der Schleifenrumpf oder Rümpfe umso schlimmer wird das.
Ein goto ist nicht nur manchmal böse.
-
@Optimizer
Dem kann ich nur zustimmen.
-
Nur die Äußerung, das PHP eine Frickelsprache ist, stößt mir etwas auf.
PHP hat mit Sicherheit einige Defiziete, ob es nun die Sicherheit oder aber die Umsetzung der OO geht.
Aber zum Frickeln gehören immer zwei. Da kann in C++ genauso viel gefrickelt werden.
Nur bei PHP wirst du durch die Möglichkeiten halt öfter zum frickeln inspiriert.
-
@Optimizer: sag ich ja auch gar nicht, ein derartiges Konstrukt hab ich persönlich nie gebraucht. Ich finde nur die Aussage Goto sei grundsätzlich böse ein wenig zu radikal. Es ist bewiesen, dass goto kein gutes Sprachmittel ist, aber man sollte sich immer die Nachteile vor Augen führen und selbst darüber nachdenken, ob diese hier wirklich greifen. Und irgendwas mit irgendwelchen Flags rumzuhantieren ist weniger gut nachzuvollziehen als ein brich die Schleife jetzt ab.
Fhul, du sagst man würde in einen komplett anderen Programmteil geworfen, aber das ist nicht wirklich so, man bricht lediglich die Schleife ab.
-
Benutzername: schrieb:
Und irgendwas mit irgendwelchen Flags rumzuhantieren ist weniger gut nachzuvollziehen als ein brich die Schleife jetzt ab.
Dem stimme ich zu. Aber dann würde ich die Schleife mit einem return abbrechen. Ich sag jetzt schon nicht, dass jedes break böse ist, aber return ziehe ich klar vor. Auf jeden Fall behaupte ich, dass ein break 2 böse ist. Ich weiß, es gibt keine absolute Wahrheit bei sowas, aber man braucht sich das Leben schon nicht irre kompliziert machen, damit man ja nicht die eine Gelegenheit verpasst, wo ein break 2 die beste Lösung scheint. Da ist es leichter, break 2 und goto zu verteufeln, da verpasst man jetzt schon nichts.

btw. Eine Schleife hat ja normal irgendeinen bestimmten Zweck, diesen Zweck kann man benennen und schon hat man eine Funktion. Man kann auch aus einer geschachtelten Schleife returnen. Es ist viel leserlicher.
-
Fhul, du sagst man würde in einen komplett anderen Programmteil geworfen, aber das ist nicht wirklich so, man bricht lediglich die Schleife ab
Du springst an die Stelle, die du definierst. Ob das nun direkt nach den Schleifenrumpf ist kann sein, muss aber nicht.
-
ich hatte noch nie das Vergnügen PHP lesen zu müssen aber bei break n dreht sich mir echt der Magen um. Jedes goto mit benannter Sprungmarke ist ein Segen dagegen.