Kontrollstruktur unless?



  • #define REPEAT  do {
    #define UNTIL(x)   } while (!(x))
    #define IF(x)    if (x)
    #define UNLESS(x)    if (!(x))
    #define THEN
    #define BEGIN   {
    #define END }
    #define ASSIGN (x, y)  x = (y)
    
    ASSIGN(x,3)
    REPEAT
      IF (x < 5) THEN
      BEGIN
      END
    UNTIL (x > 10)
    

    In der Hoffnung, daß ich so einen Code nie lesen muß 😃



  • wo wäre dann der unterschied zwischen

    while(couter < MAX)
    {
        counter++;
    }
    until(counter < MAX)
    {
        counter++;
    }
    

    natürlich heißt wort wörtlich until übersetzt "bis" und while "solange", ich hab nicht gesagt es ist dasselbe wort sondern es sind logische synonyme

    außerdem hab ich gesagt das unless macro wäre nur dann gerechtfertigt wenn man es wirklich oft benutzen muss aus irgend einem grund in einem programmbereich

    #define int main{...
    #define ..

    was du geschrieben hast, wir müssen anscheinend eine andere auffassung von oft haben weil ich ein "int main(int argc...)" nicht sonderlich oft in einem programm drin stehen habe

    if(highJump) versteht man nicht als gelehrter c++ programmierer, das versteht man als egalwas programmierer und auch als nicht programmierer

    es ging nicht darum die syntax zu verstehen sondern die logik, es möglichst einfach zu machen über den code zu lesen

    und

    if(!highGravity)
    {
        //irgend ein jump code
    }
    

    muss nicht unter umständen verständlich sein, aber wenn man es auf if(canJump) runterbricht weiss man in dem if ist irgend eine jumping behandlung (ob da jetzt character.Jump() oder sonst was drinsteht was darauf auch hinweisen würde oder ein kommentar zusätzlich zu dem if, das ist wieder was anderes)

    und auch wenn sich if(!highGravity) von selbst erklärt muss man kurz dort anhalten und "äh wenn gravity nicht true ist geht er in das if hinein. hm hm", es ist nichts weltbewegendes aber macht den code ein klein wenig schwerer lesbar

    und spätestens bei

    if(!noCollisionFound && !(highGravity || !staminaNotEmpty))

    so nen ausdruck wenn man keine eindeutigen hinweise hat worauf man abfragt eigentlich zu knacken ist richtig scheiße, auch wenn er sich natürlich "von selbst erklärt", ist ja einfache aussagenlogik, aber trotzdem wäre eine hilfsvariable nötig



  • Vevusio schrieb:

    wo wäre dann der unterschied zwischen

    while(couter < MAX)
    {
        counter++;
    }
    until(counter < MAX)
    {
        counter++;
    }
    

    Die until Variante läuft, bis die Bedingung erreicht wird (bis counter < MAX), also in Deinem Beispiel wird die Schleife gar nicht durchlaufen, sofern die Initialwert < MAX war.
    Die while-Variante läuft, solange die Bedingung erfüllt ist, terminiert also erst, wenn counter >= MAX wird.

    PS:
    Makros zu erstellen um Befehle einer Programmiersprache umzubiegen ist das allerletzte. Die Syntax einer Programmiersprache ist begrenzt und im Falle von C/C++ standardisiert, und das aus gutem Grund.
    Redundante Befehle einzuführen, die sich einem mit der Sprache vertrauten Programmierer nicht erschließen ist absolut der falsche Weg. Und wer mit der Sprache nicht vertraut ist, wird es auch mit Pseudo-Konstrukten schwer haben. Das einzige, was man damit erreicht, ist, dass der Code für beide Seiten unverständlich wird.
    Es gibt eine Regel:
    So komplex wie nötig aber so einfach wie möglich.
    Und das bedeutet: Keine redundanten Befehle, schon gar nicht, wenn sie über Makros in die Sprache reingefrickelt werden müssen. C++ Programme sind aus Unkenntnis oder Dummheit vieler Programmierer eh schon schlimm genug (es gibt viele, die meinen, etwas C in Klassen gefüllt wäre gutes C++).
    Mal ganz davon abgesehen, dass die Makroexpansion bei allen Dingen die Seiteneffekte haben, katastrophale Folgen haben kann.
    Und ja, ich rege mich auf und steigere mich rein. Solche Ergüsse sind ja wohl das Letzte. Wer meint, eine Programmiersprache mit den "guten eigenen Befehlen" erweitern zu müssen, der sollte es lieber sein lassen, also das Programmieren, meine ich.
    Wer bestimmt Konstrukte, die eine Sprache nicht bietet, benötigt, der sollte sich nach einer anderen Sprache umsehen, wo diese Konstrukte zur Verfügung gestellt werden. Ada oder Pascal vielleicht.



  • Vevusio schrieb:

    natürlich heißt wort wörtlich until übersetzt "bis" und while "solange", ich hab nicht gesagt es ist dasselbe wort sondern es sind logische synonyme

    Wenn Du der Meinung bist, dann machst Du sicher bei folgendem Spiel mit:

    Du überweist mir jeden Monat 100 EUR, solange ich lebe. Ich überweise Dir auch jeden Monat 100 EUR, bis Du lebst.



  • Vevusio schrieb:

    selbst so ein super einfacher ausdruck wie !highGravity bekommt gleich viel mehr information und verständlichkeit draufgepackt wenn man ihn für etwas konkretes benutzt (kann der charakter springen?) und dabei über einen extra boolean abstrahiert

    *zustimm*

    Aber generell hat doch niemand gesagt, dass er "until" oder "unless" ernsthaft benutzen will, oder? Und empfohlen wurde es imho auch nicht, ich verstehe die Aufregung darum nicht..



  • Badestrand schrieb:

    Aber generell hat doch niemand gesagt, dass er "until" oder "unless" ernsthaft benutzen will, oder? Und empfohlen wurde es imho auch nicht, ich verstehe die Aufregung darum nicht..

    Der einzige Grund warum man unless nicht uneingeschränkt empfehlen kann ist, dass C/C++'s Makrosystem so für die Tonne ist das man unless nicht implementieren kann:

    <condition> := break_it(with, commas)
    

    Leute die mit unless nicht klar kommen oder kategorisch gegen jeden Einsatz von Makros sind, sollten sich mal fragen wer hier zu dumm für irgendetwas ist...



  • 'f schrieb:

    Badestrand schrieb:

    Aber generell hat doch niemand gesagt, dass er "until" oder "unless" ernsthaft benutzen will, oder? Und empfohlen wurde es imho auch nicht, ich verstehe die Aufregung darum nicht..

    Der einzige Grund warum man unless nicht uneingeschränkt empfehlen kann ist, dass C/C++'s Makrosystem so für die Tonne ist das man unless nicht implementieren kann:

    <condition> := break_it(with, commas)
    

    Leute die mit unless nicht klar kommen oder kategorisch gegen jeden Einsatz von Makros sind, sollten sich mal fragen wer hier zu dumm für irgendetwas ist...

    Es gibt genügend Gründe dafür, dass in Sprachen, in denen es um hohe Betriebssicherheit der Software geht, komplett auf einen Präprozessor verzichtet wird. Ada ist hier wohl das beste Beispiel. Und in C++ wurden Templates und inline Funktionen bestimmt auch nur so aus Spaß eingeführt.
    Man man man, wenn ihr Euch eine eigene Programmiersprache bauen wollt, dann macht das von Grund auf, aber missbraucht nicht den C-Präprozessor dafür.



  • Tachyon schrieb:

    Es gibt genügend Gründe dafür, dass ist Sprachen, in denen es um hohe Betriebssicherheit der Software geht, komplett auf einen Präprozessor verzichtet wird.

    Haha, hast du gerade C++ mit hoher Betriebssicherheit in Verbindung gebracht? 😃 🤡

    Tachyon schrieb:

    Und in C++ wurden Templates und inline Funktionen bestimmt auch nur so aus Spaß eingeführt.

    Templates und inline Funktionen decken alle Einsatzmöglichkeiten von Makros ab?

    Tachyon schrieb:

    Man man man, wenn ihr Euch eine eigene Programmiersprache bauen wollt, dann macht das von Grund auf, aber missbraucht nicht den C-Präprozessor dafür.

    Inwieweit unterscheidet sich unless denn von selber definierten Funktionen, Typen, etc.?

    Btw, was wäre denn deiner Meinung nach kein Missbrauch des CPP?



  • 'f schrieb:

    Btw, was wäre denn deiner Meinung nach kein Missbrauch des CPP?

    selber definierte Funktionen, Typen, etc. Denn diese sind Sprachmittel und keine Präprozessor-Makros.



  • @pktm

    Ich weiss nicht, obs schon gesagt wurde:
    Benutz so ein Konstrukt nicht um dir "deine" Programmiersprache zu basteln...

    Das ganze extrem wird unleserlich.

    Und den ganzen Makro Kram auch nur verwenden, wenn es nicht anders geht.



  • 'f schrieb:

    Tachyon schrieb:

    Es gibt genügend Gründe dafür, dass ist Sprachen, in denen es um hohe Betriebssicherheit der Software geht, komplett auf einen Präprozessor verzichtet wird.

    Haha, hast du gerade C++ mit hoher Betriebssicherheit in Verbindung gebracht? 😃 🤡

    Ich sagte, solche Sprachen verzeichten komplett auf einen Präprozessor und führte Ada an. Verzichtet C++ auf einen Präprozessor? Ich denke nicht. Lesen hilft verstehen.

    'f schrieb:

    Tachyon schrieb:

    Und in C++ wurden Templates und inline Funktionen bestimmt auch nur so aus Spaß eingeführt.

    Templates und inline Funktionen decken alle Einsatzmöglichkeiten von Makros ab?

    Unter C++ leider nicht, da z.B. Interfaces nicht über einen entsprechenden Mechanismus eingefügt werden, sondern durch textuelle Ersetzung (#include).
    Es ging aber auch nicht um alle Einsatzmöglichkeiten, sondern um das völlig überflüssige definieren von redundanten pseudo Schlüsselwörtern.

    'f schrieb:

    Tachyon schrieb:

    Man man man, wenn ihr Euch eine eigene Programmiersprache bauen wollt, dann macht das von Grund auf, aber missbraucht nicht den C-Präprozessor dafür.

    Inwieweit unterscheidet sich unless denn von selber definierten Funktionen, Typen, etc.?

    Btw, was wäre denn deiner Meinung nach kein Missbrauch des CPP?

    Dir ist offensichtlich nichtmal der Unterschied zwischen Daten, Funktionen und Kontrollstrukturen bewusst.
    Unless wäre eine selbst definierte Kontrollstruktur, die mit textueller Ersetzung etwas nachbildet, dass sich ohne weiteres auch mit if direkt im Code, verständlich für jeden der die Sprache kennt, implementieren lässt.
    Man kann hier natürlich gerne als unregistrierter Unwissender auf irgendwelchen Leuten rumbashen, aber vielleicht solltest Du mal ein paar Bücher z.B. von Bjarne Stroustrup oder Scott Meyers lesen, bevor Du hier mit Deiner grandiosen Unwissenheit glänzt. Das Nachbilden von Kontrollstrukturen kommt in der Regel von irgendwelchen Leuten, die von einer anderen Programmiersprache her kommen, und meinen ein bestimmtes Schlüsselwort (aus der alten Sprache) wäre unbedingt erforderlich (in der Regel um irgendwelchen Code 1:1 portieren zu können) anstatt sich mit der Sprache auseinanderzusetzen und etwas vernünftiges zu generieren. Solche Leute sind leider hoffnungslose Anachronisten.



  • 'f schrieb:

    Haha, hast du gerade C++ mit hoher Betriebssicherheit in Verbindung gebracht? 😃 🤡

    Sauber geschriebener C++ Code hat auch eine hohe Betriebssicherheit. Und schlecht geschriebene Software mag von der ein oder anderen Sprache etwas abgefangen werden, wenn ich mir aber z.B. die Abstürze diverser Anwendungen ansehe hat Betriebssicherheit nichts, aber auch garnichts mit der Sprache zu tun (ob nun C++, VB, C#, Java, ...).

    Ich hoffe dir ist überhaupt bewusst wieviel Software in C++ geschrieben wurden ist (und wie alltäglich man mit dieser in Einsatz kommt).

    'f schrieb:

    Templates und inline Funktionen decken alle Einsatzmöglichkeiten von Makros ab?

    Nein, aber fast alle sinnvollen.

    'f schrieb:

    Inwieweit unterscheidet sich unless denn von selber definierten Funktionen, Typen, etc.?

    Ich würde sagen es macht grundsätzlich keinen Sinn in einer Sprache weitere Befehle mit Makros nachzubauen, da man den Code schlechter lesbar macht. Manche mögen "unless" als sinnvoll erachten, ich halte es eher für "useless", da man effektiv wie bei der Ungarischen Notation eine neue Sprache lernen muss.

    Und der Vergleich mit Funktionen, eigenen Typen und Makros ist hinfällig: Makros sind kein direktes Sprachmittel und werden nicht so unterstützt wie ersteres. Mit eigenen Funktionen und eigenen Typen schafft man nicht noch nette Nebeneffekte wie das gerne von mir angeführte max-Makro (z.B. in windows.h) wenn man nichttriviale und auswertbare ausdrücke diesem Makro übergibt.

    'f schrieb:

    Btw, was wäre denn deiner Meinung nach kein Missbrauch des CPP?

    Verwendung der C++ Sprachmittel, Vermeidung des Präprozessor wo er nicht (wie bei Include) unbedingt notwendig ist.

    cu André
    P.S: @Tachyon war keine Absicht



  • asc schrieb:

    Tachyon schrieb

    Puh, ich habe das nicht geschrieben. Bitte ändern.



  • Tachyon schrieb:

    Ich sagte, solche Sprachen verzeichten komplett auf einen Präprozessor und führte Ada an. Verzichtet C++ auf einen Präprozessor? Ich denke nicht. Lesen hilft verstehen.

    Dann solltest du vielleicht mal die Relevanz deines Einschubs erklären. Oder willst du auch Pointer, Arrays, praktisch alles was sich in C++ finden lässt verbieten weil man damit Schindluder treiben kann?

    Tachyon schrieb:

    Unter C++ leider nicht, da z.B. Interfaces nicht über einen entsprechenden Mechanismus eingefügt werden, sondern durch textuelle Ersetzung (#include).

    Tja, dann muss man wohl auf solche Hacks verzichten und einfach alles in eine Quellcodedatei packen, hm? 🙄

    Tachyon schrieb:

    Es ging aber auch nicht um alle Einsatzmöglichkeiten, sondern um das völlig überflüssige definieren von redundanten pseudo Schlüsselwörtern.

    Es ging auch um Makros allgemein. Und was meinst du denn mit "redundanten pseudo Schlüsselwörtern"?

    Wenn du meinst dass unless redundant ist, sollten wir dann nicht while[c] und [c]do ... while meiden und uns komplett auf for konzentrieren? Oder besser noch alles mit if und goto regeln?

    Tachyon schrieb:

    Dir ist offensichtlich nichtmal der Unterschied zwischen Daten, Funktionen und Kontrollstrukturen bewusst.

    Wer im Glashaus sitzt, sollte Typen nicht mit Daten gleichsetzen.

    Tachyon schrieb:

    Unless wäre eine selbst definierte Kontrollstruktur, die mit textueller Ersetzung etwas nachbildet, dass sich ohne weiteres auch mit if direkt im Code, verständlich für jeden der die Sprache kennt, implementieren lässt.

    Selbst definierte Datentypen, Funktionen, Templates, etc., lassen sich auch direkt im Code, verständlich für jeden der die Sprache kennt, implementieren. Und nun?

    Tachyon schrieb:

    Man kann hier natürlich gerne als unregistrierter Unwissender auf irgendwelchen Leuten rumbashen, aber vielleicht solltest Du mal ein paar Bücher z.B. von Bjarne Stroustrup oder Scott Meyers lesen, bevor Du hier mit Deiner grandiosen Unwissenheit glänzt. Das Nachbilden von Kontrollstrukturen kommt in der Regel von irgendwelchen Leuten, die von einer anderen Programmiersprache her kommen, und meinen ein bestimmtes Schlüsselwort (aus der alten Sprache) wäre unbedingt erforderlich (in der Regel um irgendwelchen Code 1:1 portieren zu können) anstatt sich mit der Sprache auseinanderzusetzen und etwas vernünftiges zu generieren. Solche Leute sind leider hoffnungslose Anachronisten.

    Ich kann mich auch gerne einloggen wenn dich das glücklich macht 🙄
    Deine Theorie ist im übrigen komplett falsch, allerdings, genau wie der Umstand dass du mir Unwissenheit vorwirfst, scheinbar allein weil du anderer Meinung bist, Zeugnis deiner beschränkten Vorstellungskraft und Verbohrtheit.



  • Gut, dass Du mit Deinen Meinungen hier alleine bist.

    Ich hoffe übrigens, dass, falls Du überhaupt schon alt genug bist um zu Arbeiten, Dein Code Dir vor irgendwelchen Reviews oder Code Quality Checks um die Ohren fliegt. Sonst bist Du schneller wieder draußen als Dir lieb ist (oder die Firma ist ihren Namen nicht Wert).

    Und noch eine ganz unbedarfte Frage hinterher:

    Was meinst Du, soll jemand der Deinen Code liest denken was hier passiert?

    unless(boolscher_wert)
    {
        //zeugs
    }
    

    Rufst Du eine Funktion auf die einen boolschen Wert als Argument erwartet und öffnest anschließend einen neuen Scope? Oder ist es doch ein Makro? Und wann ja, was tut das Makro? Oh, da muss man erstmal nachsehen.
    Ist natürlich viel einleuchtender als

    if(!boolscher_wert)
    {
        //zeugs
    }
    

    wo sofort jedem ohne rumsuchen klar wird, dass hier etwas passieren soll, wenn der boolsche Ausdruck falsch ist.

    }



  • 'f schrieb:

    Dann solltest du vielleicht mal die Relevanz deines Einschubs erklären. Oder willst du auch Pointer, Arrays, praktisch alles was sich in C++ finden lässt verbieten weil man damit Schindluder treiben kann

    ?
    Es geht hier gerade ausschließlich um den Präprozessor. Kennst Du überhaupt den Unterschied zwischen Präprozessor und Compiler?



  • asc schrieb:

    Sauber geschriebener C++ Code hat auch eine hohe Betriebssicherheit.

    Ja, durchaus. Allerdings nicht einmal annähernd so sicher wie viele andere Sprachen, inklusive und insbesondere Ada.

    Und die Verwendung von Makros ist in C++ nicht prinzipiell unsicher, genauso wenig wie eigene Kontrollstrukturen (in Sprachen welche vernünftige Möglichkeiten dazu bieten).

    asc schrieb:

    'f schrieb:

    Templates und inline Funktionen decken alle Einsatzmöglichkeiten von Makros ab?

    Nein, aber fast alle sinnvollen.

    asc schrieb:

    Ich würde sagen es macht grundsätzlich keinen Sinn in einer Sprache weitere Befehle mit Makros nachzubauen, da man den Code schlechter lesbar macht. Manche mögen "unless" als sinnvoll erachten, ich halte es eher für "useless", da man effektiv wie bei der Ungarischen Notation eine neue Sprache lernen muss.

    Und der Vergleich mit Funktionen, eigenen Typen und Makros ist hinfällig:

    Nein, er ist keineswegs hinfällig: "Manche mögen Bibliotheken dritter als sinnvoll erachten, ich halte es eher für 'useless', da man effektiv wie bei der Ungarischen Notation eine neue Sprache lernen muss."

    asc schrieb:

    'f schrieb:

    Btw, was wäre denn deiner Meinung nach kein Missbrauch des CPP?

    Verwendung der C++ Sprachmittel, Vermeidung des Präprozessor wo er nicht (wie bei Include) unbedingt notwendig ist.

    CPP = C preprocessor



  • Tachyon schrieb:

    Gut, dass Du mit Deinen Meinungen hier alleine bist.

    Ich hoffe übrigens, dass, falls Du überhaupt schon alt genug bist um zu Arbeiten, Dein Code Dir vor irgendwelchen Reviews oder Code Quality Checks um die Ohren fliegt. Sonst bist Du schneller wieder draußen als Dir lieb ist (oder die Firma ist ihren Namen nicht Wert).

    Ein Haufen Fehlschlüsse gepaart mit Beleidigungen ersetzen noch lange kein Argument.



  • LordJaxom schrieb:

    'f schrieb:

    Dann solltest du vielleicht mal die Relevanz deines Einschubs erklären. Oder willst du auch Pointer, Arrays, praktisch alles was sich in C++ finden lässt verbieten weil man damit Schindluder treiben kann

    ?
    Es geht hier gerade ausschließlich um den Präprozessor. Kennst Du überhaupt den Unterschied zwischen Präprozessor und Compiler?

    Uh. Was soll mir denn dieser schwachsinnige und offensichtlich falsche Kommentar näher bringen?



  • 'f schrieb:

    Ja, durchaus. Allerdings nicht einmal annähernd so sicher wie viele andere Sprachen, inklusive und insbesondere Ada.

    Aussage, kein Argument.

    'f schrieb:

    Und die Verwendung von Makros ist in C++ nicht prinzipiell unsicher, genauso wenig wie eigene Kontrollstrukturen (in Sprachen welche vernünftige Möglichkeiten dazu bieten).

    Aussage, kein Argument.

    'f schrieb:

    Nein, er ist keineswegs hinfällig: "Manche mögen Bibliotheken dritter als sinnvoll erachten, ich halte es eher für 'useless', da man effektiv wie bei der Ungarischen Notation eine neue Sprache lernen muss."

    Noch eine Aussage ohne Argumente.

    'f schrieb:

    Ein Haufen Fehlschlüsse gepaart mit Beleidigungen ersetzen noch lange kein Argument.

    Eine ulkige Aussage im Hinblick darauf, dass Du in Deinen gesamten Ergüssen hier NUR Aussagen triffst ohne jemals Argumente dazu zu liefern.


Anmelden zum Antworten