Kontrollstruktur unless?



  • Hi!

    Gibt es eigentlich auch die Kontrollstruktur unless( X ) in C++?
    Unless entspricht ja if( !Bedingung ).

    Grüße, pktm



  • Simple Frage simple Antwort: Nein 😉



  • pktm schrieb:

    Hi!

    Gibt es eigentlich auch die Kontrollstruktur unless( X ) in C++?
    Unless entspricht ja if( !Bedingung ).

    warum? genauso möglich wäre eine unless schleife.

    wie

    do
    {
    ...
    }
    unless(Bedingung)
    


  • otze schrieb:

    pktm schrieb:

    Hi!

    Gibt es eigentlich auch die Kontrollstruktur unless( X ) in C++?
    Unless entspricht ja if( !Bedingung ).

    warum? genauso möglich wäre eine unless schleife.

    wie

    do
    {
    ...
    }
    unless(Bedingung)
    

    Seit wann gibts denn das in C++? Du meinst sicher:

    do
    {
    ...
    }
    while (!Bedingung)
    


  • otze schrieb:

    warum? genauso möglich wäre eine unless schleife.

    Die würde man wohl until nennen.

    In Common Lisp gibt es übrigens ein unless-Makro.



  • #define unless(x) if(!(x))
    


  • LordJaxom schrieb:

    #define unless(x) if(!(x))
    

    Wow, cool! Danke *freu*

    Warum? Tja... *grins*



  • pktm schrieb:

    LordJaxom schrieb:

    #define unless(x) if(!(x))
    

    Wow, cool! Danke *freu*

    Warum? Tja... *grins*

    🙄

    Man kann heute schon jeden mit simplen defines beeindrucken!



  • D schrieb:

    pktm schrieb:

    LordJaxom schrieb:

    #define unless(x) if(!(x))
    

    Wow, cool! Danke *freu*

    Warum? Tja... *grins*

    🙄

    Man kann heute schon jeden mit simplen defines beeindrucken!

    Das kommt halt immer darauf an, wie viel derjenige von der Sprache weis.



  • und was wird aus do{} unless(...) ?
    -> das define muss dann while(!...) heißen



  • wurst schrieb:

    und was wird aus do{} unless(...) ?
    -> das define muss dann while(!...) heißen

    Du meinst wohl until 😃

    #define until(x) while(!(x))
    

    Ich frag mich schon ernsthaft, ob die Namen while und if so schlimm sind, dass man sie durch eigene Kreationen ersetzen muss? 🙄



  • LordJaxom schrieb:

    #define unless(x) if(!(x))
    

    Pfui. Sowas unsicheres wie Makros verwenden nur um ein if( not xxx ) durch was eigenes zu ersetzen? Das ist nicht nur wegen der üblichen Makro-Issues bedenklich (wenn irgendwo eine Variable oder Typ unless erwähnt wird, dann ersetzt das Makro das völlig ungeniert etc.) sondern ich würds fast als moralisch verwerflich bezeichnen 😛



  • until(x) über while(!x) zu definieren wäre falsch weil until und while logisch dieselbe aussage treffen, also beides sind synonyme

    ein macro für unless zu machen kann unter umständen schon sinn machen wenn man es oft braucht da ifs mit anschließenden negationen für menschen allgemein schwer verständlich sind

    "we disagreed not to agree on not going to the store" sehr einfacher satz eigentlich aber man braucht trotzdem nen bisschen um rauszufinden was eigentlich damit gemeint ist

    allerdings würde ich trotzdem statt einem "unless" zu einem zusätzlichen boolean wert greifen der entsprechend benannt wird in solchen fällen, etwas wie

    bool isRowEditable = !hasIllegalArgument | (loginRights & RIGHT_EDIT) | !(elementFocus | elementIdle)
    
    if(isRowEditable)...
    

    nicht das das jetzt irgendwie sinn machen würde (die art wie ich den boolean da definiert habe) aber würde das in dem if drin stehen könnte man das ebenfalls schmeißen, solche ausdrücke sind furchtbar im programmcode und sollten möglichst abstrahiert werden

    ich mache sowas im grunde auch schon für ganz einfache dinge wie, aus der luft gegriffen

    bool canJump = !highGravity;
    

    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

    also grundsätzlich spricht nichts gegen so ein unless macro (vllt eher einfach nur eines das eine negation vornimmt und nicht gleich ein if mit drin hat)

    allerdings solltest du dir überlegen ob du nicht lieber mit booleans arbeiten möchtest da es eben "mehr native ist"



  • Vevusio schrieb:

    until(x) über while(!x) zu definieren wäre falsch weil until und while logisch dieselbe aussage treffen, also beides sind synonyme

    talk about... etwas ist für menschen allgemein schwer verständlich 😕
    "solange" (while) und "solange bis" (until) sind nicht wirklich synonyme, solange bis du mir folgen kannst 🙂

    ein macro für unless zu machen kann unter umständen schon sinn machen wenn man es oft braucht da ifs mit anschließenden negationen für menschen allgemein schwer verständlich sind

    und was ist damit:

    Hauptprogramm:
     Standardausgabe soll  "Hello World" anzeigen
    
    Stop
    

    das ist doch wohl um einiges verständlicher als ein typisches hello-world programm, und braucht nur

    #define Hauptprogramm int main () { start
    #define Standardausgabe std::cout
    #define soll <<
    #define anzeigen << endl;
    #define Stop }
    

    wenn du C++ lernst, ist dir C++ verständlich. wenn du eine abfrage wie

    if (canJump)
    

    siehst, weißt du sofort, was gemeint ist. auch

    if (!highGravity)
    

    erklärt sich dir dann von selbst.

    aber was

    unless(highGravity)
    

    bedeuten soll, das weißt du als gelernter C++ler einfach nicht bevor du dich nicht durch unmengen an dokumentation durchgeschlagen hast - *und* ausschließt, dass es irgendwo eine variable gibt, die "unless" heißt *und* sicherstellst, dass das macro überall, wo es verwendet wird, auch definiert ist.



  • #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...


Anmelden zum Antworten