Reihenfolge in der Auswertung eines Bedingungsausdrucks



  • Hallo,

    es geht um folgende Schleife:

    bool array[MAX_ARRAY_ELEM];
    
    for(j=0;(j<MAX_ARRAY_ELEM && array[j]);j++)
    {
     // mach nichts.
    }
    

    Ist die Reihenfolge der Auswertung des Bedingungsausdrucks der for-Schleife so festgelegt, dass sobald der erste Ausdruck (j<MAX_ARRAY_ELEM) false ist, der zweite überhaupt nicht mehr ausgewertet wird, oder ist dies einfach schlechter Code, da ich so evtl. auf ein array-Element verweise, dass es überhaupt nicht gibt?
    Wenn es schlechter Code ist, wie löse ist das dann anders? Geht etwa Folgendes?:

    for(j=0;j<MAX_ARRAY_ELEM;j++)
    {
     if(!array[j])
      break;
    }
    

    Vielen Dank und Gruß
    HHe



  • HHe schrieb:

    Ist die Reihenfolge der Auswertung des Bedingungsausdrucks der for-Schleife so festgelegt, dass sobald der erste Ausdruck (j<MAX_ARRAY_ELEM) false ist, der zweite überhaupt nicht mehr ausgewertet wird,

    Das hat nichts mit Schleifenbedingungen zu tun, sondern ist für den &&-Operator so festgelegt. Bei A && B wird B nur ausgewertet, wenn A ist.

    An dem Code ist also nichts auszusetzen. Die innere Klammer um die Bedingung ist aber unnötig.



  • Vielen Dank!



  • Wenn du dir einen XOR oder XNOR Operator überlädst, kannst du damit beide Ausdrücke überprüfen lassen.
    Oder halt ganz billig.

    ((a && !b) || (!a && b))  : XOR
    
    ((a && b) || (!a && !b))  : XNOR
    

    Greetz



  • Spence schrieb:

    Wenn du dir einen XOR oder XNOR Operator überlädst...

    ich nehme an, er benutzt C und nicht in VHDL.
    🙂



  • Spence schrieb:

    ((a && !b) || (!a && b))  : XOR
    
    ((a && b) || (!a && !b))  : XNOR
    

    Ich weiß zwar nicht was das jetzt mit der Frage zu tun hat, aber das geht auch einfacher mit

    !a != !b  // XOR
    !a == !b  // XNOR
    


  • +fricky schrieb:

    ich nehme an, er benutzt C und nicht in VHDL.
    🙂

    Ja, das dachte ich mir auch, weshalb ich keinen Quelltext geschrieben habe, sondern nur den mathematischen Ausdruck.
    Den Code, zumindest den entscheidenden, hat ja namespace invader geschrieben.
    Ich hab mich zwar bisher noch nicht mit VHDL beschäftigt, aber wenn das so läuft... wieder was gelernt 😃

    Greetz



  • Spence schrieb:

    Ich hab mich zwar bisher noch nicht mit VHDL beschäftigt, aber wenn das so läuft... wieder was gelernt

    naja, weil du xnor überladen wolltest. das kannste in c nicht machen.
    🙂



  • Bin mir nicht sicher, aber ich meine mal gelesen zu haben (hier im Forum?), dass die Auswertereihenfolge undefiniert ist, d. h. dass es dem Compiler überlassen ist, ob erst die linke oder erst die Rechte Seite ausgewertet wird.



  • anonymus schrieb:

    Bin mir nicht sicher, aber ich meine mal gelesen zu haben (hier im Forum?), dass die Auswertereihenfolge undefiniert ist, d. h. dass es dem Compiler überlassen ist, ob erst die linke oder erst die Rechte Seite ausgewertet wird.

    nein, sie ist sehr wohl definiert. Hab grad keine Lust im Standard nachzuschauen 😉



  • Das ganze nennt sich "Short Circuit Evaluation" und wird von C unterstützt.

    Damit ist folgendes legitim:

    int a = 0;
    int b = GetValue();
    if (a && ((b / a) > 5))
      printf("a ist != 0!");
    

    Ist a == 0, so wird der zweite Teil nicht mehr ausgeführt und es kommt zu keiner Division durch 0.



  • was ist mit

    while (a > 0 && do_something_very_important()) {
        //...
    };
    

    kann ich mich nicht drauf verlassen, dass do_something_very_important() ausgeführt wird wenn jetzt a <= 0 ist?



  • Du kannst dich nicht nur nicht darauf verlassen. Du kannst dich sogar darauf verlassen, dass es bei nichtpositivem a nicht ausgeführt wird. Das ist ja der Sinn der Sache.


Anmelden zum Antworten