switch-case Problematik
-
pointercrash() schrieb:
Ist ja nicht sinnlos, wenn mit continue einfach zur Auswertung des switch- Arguments zurückgesprungen würde. Das wäre völlig analog zur Behandlung von continue in Schleifen.
Im Gegenteil, es nicht so zu machen, bedeutet den größeren logischen Bruch.continue ist für Schleifenkonstukte definiert, switch ist keines, daher sollte continue keine Auswirkungen auf switches ohne umrahmende Schleifen haben, also NoOp.
Philosophieren darüber ist aber sicher erlaubt
-
Ich stelle mir das schon vor:
switch (x) { case 1: break; // Beendet Case-Zweig break; // Verlässt Switch-Schleife case 2: continue; // Beginnt von vorne (Start der Switch-Schleife) break; // Beendet Case-Zweig default: break; // Beendet Case-Zweig break; // Verlässt Switch-Schleife }
-
volkard schrieb:
Ich bin dankbar, daß Du keine "logische" Sprache entwirfst.
Es ist zum Kotzen mit Dir, immer bei Mangel an Argumenten wirst Du persönlich.
Wutz schrieb:
continue ist für Schleifenkonstukte definiert, switch ist keines, daher sollte continue keine Auswirkungen auf switches ohne umrahmende Schleifen haben, also NoOp.
Philosophieren darüber ist aber sicher erlaubtGenau so hatte ich es gemeint!
-
pointercrash() schrieb:
Es ist zum Kotzen mit Dir, immer bei Mangel an Argumenten wirst Du persönlich.
er hat doch vollkommen recht. "continue" hat als einzige semantik "fahre mit dem nächsten schleifendurchgang fort". keine andere. switch ist keine schleife. end of story. das ist bereits logisch, so wie es ist, und continue mit einer bedeutung für nicht-schleifen zu überladen wäre sicherlich nicht logik-förderlich. da kann man schon eher drüber diskutieren, ob eben jene überladung für "break" logisch ist.
ru,
cirion
-
Finde diese Diskusion absulut sinnlos, und kann mich nur volkard anschließen, "Ich bin dankbar, daß Du keine "logische" Sprache entwirfst.".
-
cirion schrieb:
er hat doch vollkommen recht. "continue" hat als einzige semantik "fahre mit dem nächsten schleifendurchgang fort". keine andere.
Falsch. Das ist eine Interpretation, die semantisch nach menschlichem Gebrauch sowieso nur unsinnig ist, weil "continue" "mach weiter so" bedeutet.
cirion schrieb:
switch ist keine schleife. end of story. das ist bereits logisch
Nö, wenn man volkards Lesart von C als Assemblermakrosammlung deutet, eben nicht.
cirion schrieb:
, so wie es ist, und continue mit einer bedeutung für nicht-schleifen zu überladen wäre sicherlich nicht logik-förderlich.
Nö, wenn man continue als "fang bei dem umschließenden Block neu an" interpretiert, eben nicht.
cirion schrieb:
da kann man schon eher drüber diskutieren, ob eben jene überladung für "break" logisch ist.
Hatte ich vorher schon geschrieben ...
-
kopfschüttel schrieb:
Finde diese Diskusion absulut sinnlos, und kann mich nur volkard anschließen, "Ich bin dankbar, daß Du keine "logische" Sprache entwirfst.".
Dann schüttel mal den Kopf wie versprochen ... argumentfreies Gesabbel mußt Du als unreg nicht posten.
-
Es ist schon korrekt, dass
continue
nicht fürswitch
gilt. Das wäre schon aus sprachlicher Sicht vollkommen irreführend:case 1000: // ... continue; // Er geht also ins nächste case (2000). Unlogisch + sinnlos! case 2000: // ... break; // Er bricht aus der Verzweigung heraus. Logisch + sinnvoll.
Bei einer Schleife ist der Sinn jedoch nachvollziehbar. Die Schleife wird am Anfang fortgesetzt (contiue) bzw. abgebrochen (break).
-
pointercrash() schrieb:
Falsch. Das ist eine Interpretation, die semantisch nach menschlichem Gebrauch sowieso nur unsinnig ist, weil "continue" "mach weiter so" bedeutet.
aha. du gehst also nach der semantik der englischen sprache? dann erklär mir mal anhanddessen, was eine "for"-schleife ist. die semantik einer computersprache ist halt schon was anderes. obs nun "continue" oder "brtzlkt" heisst, ist wursch - die semantik dessen ist nunmal "mach mit der schleife weiter".
Nö, wenn man continue als "fang bei dem umschließenden Block neu an" interpretiert, eben nicht.
mit dieser semantik würde
{ // irgendwas continue; }
zur schleife mutieren. ganz abgesehen davon, dass dann auch if-konstrukte "verschleifbar" wären (letztlich ist switch semantisch nur convenience-ersatz für if-else-kaskaden). keine gute idee - die lesbarkeit wäre dann völlig dahin. es macht schon sinn, dass jede form von schleife als solche bereits an ihrem kopf erkennbar ist.
ru,
cirion
-
Lesen -> Denken -> Posten
Ich wollte ja nicht continue als Blödmannimplementation angedacht wissen, sondern als reentry in den Blockheader. Das führt wie bei Schleifen in den Entscheidungsteil (naja, bei do halt nicht).
-
pointercrash() schrieb:
sondern als reentry in den Blockheader. Das führt wie bei Schleifen in den Entscheidungsteil (naja, bei do halt nicht).
das macht das erst zur schleife, und damit die schleife nicht mehr am kopf erkennbar. wenn du drauf stehst, bastel dir nen kleinen präprozessor dafür - aber die meisten programmierer würden aus gutem grund einen großen bogen um sowas machen.
ru,
cirion
-
cirion schrieb:
es macht schon sinn, dass jede form von schleife als solche bereits an ihrem kopf erkennbar ist.
Ich lach' mich schief, da sind tatsächlich "fighters for the truth" einer Sprache, die einen jährlichen Wettbewerb im "most obfuscative code" (höchst erfolgreich) abhalten und die's nicht anders andenken wollen, weil's schon immer so war?
Nee, ich dachte, 'ne Frage wär's wert, warum continue ausgerechnet für switch nicht gelten sollte, aber deswegen Anfeindungen zu kassieren, naja, was kommt nach dem großteils nicht implementierten C99?
-
du stellst eine frage, die mit sprachdesign zu tun hat, und kommst dann mit argumenten, die höchstens mit sprachmissbrauch zu tun haben. was erwartest du? die antwort aus sicht des scriptkiddies, das so eine fixe idee toll findet, weil man plötzlich schleifen auch noch "obfuscaten" kann, oder eine antwort aus sicht eines informatikers, der sich mit sprachdesign ein wenig auskennt? letzteres wohl eher nicht...
ru,
cirion
-
knivil schrieb:
Nur kann es passieren, dass der Compiler die Reihenfolge meiner cases verändert?
Wie kommst du ueberhaupt auf diese Idee?
Naja, ich kam auf diese Vermutung, da es innerhalb eines switch-case Blocks nicht möglich ist eine Variable zu definieren. Aber das kann ja auch nicht gehen, logisch. Und das hat dann auch nichts mit meiner Vermutung zu tun.
Aber, um bei der Sache zu bleiben, eine umschachtelnde Infinite-Loop hätte schon einen kleinen Vorteil. Man müsste die Labeln nicht mehr sequentiell aufsteigend anordnen, schätze ich mal.
Gruss
T.
-
cirion schrieb:
du stellst eine frage, die mit sprachdesign zu tun hat, und kommst dann mit argumenten, die höchstens mit sprachmissbrauch zu tun haben.
Begründungslose Behauptung.
cirion schrieb:
was erwartest du? die antwort aus sicht des scriptkiddies, das so eine fixe idee toll findet, weil man plötzlich schleifen auch noch "obfuscaten" kann,
Eine sinnvolle Antwort, warum das nicht so sein sollte.
cirion schrieb:
oder eine antwort aus sicht eines informatikers, der sich mit sprachdesign ein wenig auskennt?
Ach, laß mal stecken. Ich hab' nur zwei Jahrgänge Elektrotechniker mit meinem Solver versorgt, bis es den PB 1000 nicht mehr gab und ich anderes zu tun hatte. Glaub' mir, was Praxistauglichkeit anbelangt bist Du mit Information unterversorgt.
-
pointercrash() schrieb:
Ach, laß mal stecken. Ich hab' nur zwei Jahrgänge Elektrotechniker mit meinem Solver versorgt, bis es den PB 1000 nicht mehr gab und ich anderes zu tun hatte. Glaub' mir, was Praxistauglichkeit anbelangt bist Du mit Information unterversorgt.
soll mich das jetzt beeindrucken, oder was? das einzige, was das vermittelt, ist deine selbstüberschätzung.
ru,
cirion
-
@cirion: Willkommen im Klub.
Und laß Dich nicht ärgern.
-
volkard schrieb:
@cirion: Willkommen im Klub.
danke
Und laß Dich nicht ärgern.
ach, da bin ich schlimmeres gewohnt
ru,
cirion
-
Tomahawk schrieb:
Aber, um bei der Sache zu bleiben, eine umschachtelnde Infinite-Loop hätte schon einen kleinen Vorteil. Man müsste die Labeln nicht mehr sequentiell aufsteigend anordnen, schätze ich mal.
Du hattest doch mal arge Sorgen um die Performance. Üblicherweise hast Du im ASM- Output oben im Switch- Head die Entscheidung, welches Label (case) angesprungen wird. Ich weiß nicht, ob das Standard ist, aber nach drei Compilern scheint das so zu sein. Danach wird nichts mehr geprüft, nur beim break gehts an das switch- Ende, ansonsten wird der Code weiter stur durchgeackert.
Das kann man aktiv nutzen, um z.B. upper/lowercase- Anpassungen zu vermeiden oder einfach jeden case mit break abzuschließen.
-
volkard schrieb:
@cirion: Willkommen im Klub.
Und laß Dich nicht ärgern.cirion schrieb:
ach, da bin ich schlimmeres gewohnt
Was wollt ihr dann hier noch? Geht doch einfach heiraten (ist ja mittlerweile erlaubt).