Goto Punkteabzug?



  • Z schrieb:

    Bashar schrieb:

    Mit try...catch kannst du nur sehr eingeschränkt springen, immer nur vom throw nach außen zu einem dynamisch(!) umschließenden catch.

    Es ist kein "goto zu fester Sprungmarke" sondern ein "goto zu mehreren Sprungmarken", ein 1-zu-n goto. Ich würde es nicht als sehr eingeschränkt bezeichnen.

    Es gibt mindestens eine sehr wichtige Unterscheidung zu einem goto: Man kann nur in eine Richtung "springen", und nicht kreuz und quer durch den Programmfluß hüpfen. Exceptions habe einen klaren Ablauf, ebenso wie Schleifen, nicht aber wie ein goto-Befehl.



  • Würde das behoben sein, wenn man sich darauf beschränken würde, mit goto nur abwärts zu springen und nie in blöcke reinzuspringen?



  • asc schrieb:

    Es gibt mindestens eine sehr wichtige Unterscheidung zu einem goto: Man kann nur in eine Richtung "springen", und nicht kreuz und quer durch den Programmfluß hüpfen. Exceptions habe einen klaren Ablauf, ebenso wie Schleifen, nicht aber wie ein goto-Befehl.

    bei einem goto weiss ich immer genau wo es hin springt (ich sehe das label ja direkt am bildschirm) aber wo eine exception gefangen wird, das weiss ich nicht, das kann ich garnicht wissen. ich muss annehmen dass sie korrekt gefangen wird.

    dass goto schlecht ist, stammt aus einer anderen zeit. es gibt ja immer mehr goto-ersatz. zB ein break das 2 schleifen breakt und nicht nur eine, exceptions und natürlich returns (früher hatte man ja single entry/single exit). also wo ist das problem wenn man goto verwendet?

    das problem ist dann nicht goto sondern spaghetti code...



  • Nexus schrieb:

    Z schrieb:

    Sicherlich ist das eins. Und zwar sogar eins, das über Funktionsgrenzen springt. Die catch-Anweisung ist dabei die Sprungmarke.

    So kann man aber nicht argumentieren. Dann müsste man alle Schleifen und Funktionsaufrufe ebenfalls als goto zählen. Den Unterschied zwischen goto und verstecktem Sprung musst du schon sehen.

    Ja, das stimmt. Funktionsaufrufe sind gotos mit automatischem Rücksprung, Schleifen sind wiederholte gotos mit Abbruchbedingung. Insgesamt sind sie alle mit zusätzlicher Funktionalität versehene gotos, damit wir das echte goto nicht benutzen müssen.

    asc schrieb:

    Es gibt mindestens eine sehr wichtige Unterscheidung zu einem goto: Man kann nur in eine Richtung "springen", und nicht kreuz und quer durch den Programmfluß hüpfen. Exceptions habe einen klaren Ablauf, ebenso wie Schleifen, nicht aber wie ein goto-Befehl.

    Das Verhalten eines gotos ist auch eindeutig, es heisst "Springe von hier bis dort", nicht in die andere Richtung, denn dazu bräuchte man ein weiteres goto.



  • Shade Of Mine schrieb:

    das problem ist dann nicht goto sondern spaghetti code...

    Vollkommen korrekt. Und Spaghetticode bekommt man auch ohne goto hin.



  • Z schrieb:

    Bashar schrieb:

    Mit try...catch kannst du nur sehr eingeschränkt springen, immer nur vom throw nach außen zu einem dynamisch(!) umschließenden catch.

    Es ist kein "goto zu fester Sprungmarke" sondern ein "goto zu mehreren Sprungmarken", ein 1-zu-n goto. Ich würde es nicht als sehr eingeschränkt bezeichnen.

    Manche gotos können zu try..catch gemacht werden um umgekehrt, aber es gibt für beide Situationen, wo das nicht geht. Klarer Fall von "nicht dasselbe".

    Nein. Du kannst nicht aus Funktionen hinausspringen.

    Deshalb schrieb ich "so gut wie".

    Bashar schrieb:

    Gerade das ist das Problem an goto, weshalb diese populären Gleichsetzungen von goto mit return, break oder sonstigen Sprüngen völlig am Thema vorbeigehen.

    Aber switch/case entspricht in BASIC dem "ON x GOTO ...".

    Nein, mit switch kannst du nur in case-Labels, die im switch-Statement stehen, springen, mit ON x GOTO kannst du beliebige Marken oder Zeilen anspringen.

    Genauso wie break ein goto ohne explizite Sprungmarke ist. Es gibt schon einige versteckte gotos, wir nennen sie nur anders und deshalb finden wir nicht, dass sie böse sind.

    Wieso müssen wir andauernd diese Diskussion wiederholen? Beim letzten Mal war das mit fricky, und mir fällt grad auf, dass du registriert bist seit er weg ist. Aber der kennt kein try..catch, also verkneife ich mir mal irgendwelche voreiligen Schlüsse.

    Das Problem an goto ist, dass man damit vorwärts und rückwärts an der durch die Blockstruktur gegebenen Programmstruktur vorbeispringen kann. Das gilt für keines deiner sogenannten versteckten gotos, und das ist auch der Grund, warum diese nicht als "böse" gelten: break, continue und return haben fest vorgegebene Sprungziele, die sich durch die Blockstruktur ergeben (lexikalisch). switch springt nur ein enthaltenes case- oder default-Label an. Schleifen sind in sich schon Blockstrukturen. Exceptions springen innerhalb einer dynamisch vorgegebenen Blockstruktur nach außen.



  • Samyboy schrieb:

    PS: Hab diesen Thread extra ins falsche Forum getan, weshalb kann man in "Rund um die Programmierung" keine Umfragen erstellen?

    Paßt hier besser. Andere Sprachen haben ganz andere Verhältnisse zu goto.



  • Bashar schrieb:

    Bashar schrieb:

    Gerade das ist das Problem an goto, weshalb diese populären Gleichsetzungen von goto mit return, break oder sonstigen Sprüngen völlig am Thema vorbeigehen.

    Aber switch/case entspricht in BASIC dem "ON x GOTO ...".

    Nein, mit switch kannst du nur in case-Labels, die im switch-Statement stehen, springen, mit ON x GOTO kannst du beliebige Marken oder Zeilen anspringen.

    Natürlich ist es nicht exakt dasselbe, BASIC und C++ sind verschiedene Sprachen, aber ich denke die Ähnlichkeit beider Konstrukte wirst Du auch sehen.

    Bashar schrieb:

    Wieso müssen wir andauernd diese Diskussion wiederholen? Beim letzten Mal war das mit fricky, und mir fällt grad auf, dass du registriert bist seit er weg ist. Aber der kennt kein try..catch, also verkneife ich mir mal irgendwelche voreiligen Schlüsse.

    Ja, ich kann mir vorstellen, dass solche Diskussionen hier öfter laufen. Und nein, ich war vorher noch nie hier registriert.

    Bashar schrieb:

    Das Problem an goto ist, dass man damit vorwärts und rückwärts an der durch die Blockstruktur gegebenen Programmstruktur vorbeispringen kann.

    Deswegen, das sagte ich schon, sollte man gotos mit Bedacht einsetzen. Übrigens kannst Du auch keine Variableninitialisierungen überspringen, ohne dass der Compiler sich beschwert



  • Lupo4u2 schrieb:

    edit: Yeah! ab jetzt schreib ich keinen Beitrag mehr! 🤡

    Hehe, und was meinst du, wie lange du das durchhältst?



  • volkard schrieb:

    Untersuchung Achsensymmetrie zur y-Achse (Bedingung f(x)=f(-x)):
    f(1)=-1
    f(-1)=-3
    f(1)!=f(-1)
    Da die Bedingung f(x)=f(-x) für x=1 nicht erfüllt ist, kann sie auch nicht für alle x erfüllt sein. Damit ist f nicht achsensymmetrisch zur y-Achse.
    Das ist für ihn nicht "gerechnet".

    Was er haben will, und mit vollen Punkten versieht, ist folgendes:
    ...

    naja, wenn es heißt: \forall x: f(x) = f(-x) und man muss das beweisen, dann genügt es auch ein Gegenbeispiel. An der Uni beweist man oft so.



  • Dass das reicht, oder dass man das oft so macht, hindert aber manche Leute nicht daran, es nicht zu kapieren.


Anmelden zum Antworten