Hello, Guest the thread was called488 times and contains 8 replays

last post from wolfme at the

IF mit Klammern - was macht dieser Aufruf?

  • Moin,


    was macht Basic eigentlich mit den Werten in Klammern, sind das "Unter-IF-Prüfungen"?
    Irgendwie kann ich mir gerade keinen Reim auf diesen Ausdruck machen.


    EK = Einkommen
    KO = Kosten


    IF (EK < 20000 ) * ( KO = 0 ) THEN RETURN


    Also wenn das Einkommen < 20000 ... und die Kosten = 0 multipliziert mit dem Einkommen... ähh...wus? ?(

  • Vergleichsoperatoren ergeben:
    0 wenn der Vergleich falsch ist.
    -1 wenn der Vergleich wahr ist.
    Und das IF interessiert sich sowieso nur für "Null oder nicht-Null".
    In dem Beispiel wird also RETURN ausgeführt, wenn die Multiplikation etwas anderes als Null ergibt. Dafür müssen beide Faktoren ungleich Null sein, also müssen beide Vergleiche "wahr" ergeben.
    Man hätte statt "*" auch einfach "AND" schreiben können, das hätte den gleichen Effekt gehabt.

  • Die beiden Ausdrücke in den Klammern liefern jeweils entweder -1 oder 0. Der Gesamtausdruck ist damit entweder 0 (wenn einer der geklammerten Ausdrücke 0, also falsch ist) oder 1, wenn beide wahr (also -1) sind. Denn irgendwas*0 ist halt 0 und -1 * -1 ist 1.
    Der Teil hinter dem THEN wird ausgeführt, wenn der Gesamtausdruck ungleich 0 ist. Also anders ausgedrückt...da steht im Prinzip eine schlechter lesbare Variante von:



    IF (EK < 20000 ) AND ( KO = 0 ) THEN RETURN

  • IF (EK < 20000 ) AND ( KO = 0 ) THEN RETURN


    Operator * als AND zu benutzen ist glaub ich laufzeittechnisch auch aufwändiger und man muss gerade deswegen auch die Klammerung verwenden. Das ergäbe nur dann einen Sinn, wenn man das nicht im IF-THEN-Kontext verwendet, also das Ergebnis der IF-Bedingung für eine weitere rechnerische Auswertung nutzen möchte.


    Mit AND kann man sich die Klammern (auch die Leerzeichen, aber hier zwecks Lesbarkeit belassen) sparen und spart sich das Parsing der Zeichen durch den Interpreter:
    IF EK < 20000 AND KO = 0 THEN RETURN


    Wenn man dahingehend weiter optimieren möchte kann man AND-Abfolgen auch immer in einer IF-THEN-Kaskade abbilden:
    IF EK < 20000 THEN IF KO = 0 THEN RETURN
    Dabei sollte man jene Bedingung zuerst anführen, die am seltensten eintreten.

  • Möglicherweise war das * als Trick gedacht, um den Wertebereich von -32768 bis +32767 darüber hinaus zu erweitern.

    Also in dieser Verwendung sehe keinen Nutzen für den "Trick". Die Klammerausdrücke können keinen Wert abseits von 0 und -1 liefern. Einziger Unterschied ist, dass im *-Fall der Gesamtausdruck den Wert 1 ergibt (-1 im Falle von AND). Das könnte man dann brauchen, wenn z.B. daraus direkt einen Wert ableitet, z.B.


    POKE AD, PEEK(AD) OR (EK < 20000 ) * ( KO = 0 )
    um Bit 0 zu setzen, wenn die Bedingung erfüllt ist.


    Aber des geht vermutlich selbst dann auch billiger mit
    POKE AD, PEEK(AD) OR ABS(EK < 20000 AND KO = 0)
    oder
    POKE AD, PEEK(AD) OR -(EK < 20000 AND KO = 0)