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 gelerntGreetz
-
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.