True-bedingung in for-schleife - wie ist die Auswertung?
-
Hallo,
ich habe eine frage die mir einen tag lang einen Bug verursacht hat und ihc jetzt dahintergekommen bin.
was ich möchte: Ich habe eine for-schleife und will 2 Bedingungen überprüfen lassen. Falls eine false wird, soll die schleife abgebrochen werden. Leider scheint die zweite bedingunge nicht ausgewertet zu werden - kann das sein?
folgendes geht nicht:
for (int el = 0; (el < maxnew && (el < len); el++)folgendes geht:
for (int el = 0; el < maxnew;el++) if (el < len) break;Kann das sein oder liegt mein bug wo anders? Wie ist denn die Auswertung in for-schleifen bezüglich mehrerer Bedingungen?
Danke
-
gast_xy schrieb:
for (int el = 0; (el < maxnew && (el < len); el++)Hier fehlt eine schließende Klammer.
gast_xy schrieb:
Wie ist denn die Auswertung in for-schleifen bezüglich mehrerer Bedingungen?
Nicht anders als anderswo. "geht nicht" ist keine Fehlerbeschreibung.
-
gast_xy schrieb:
folgendes geht nicht:
for (int el = 0; (el < maxnew && (el < len); el++)folgendes geht:
for (int el = 0; el < maxnew;el++) if (el < len) break;Im ersten Fall läuft die Schleife weiter, wenn e1 < len ist, im zweiten bricht sie dann ab. Was wundert dich daran? Dass die for-Schleife läuft, solange die Bedingung erfüllt ist, scheinst du ja zu wissen, sonst hättest du das mit e1 < maxnew auch nicht hingekriegt.
-
ja die Klammer ist schon dort, habe sie hier halt im post ausversehen rausgenommen.
Also ich wollte nur wissen ob beide bedingungen überprüft werden und ausgewertet werden und nicht nur die erste. also ob el < maxnew,
also es müssen doch beide bedingungen erfüllt sein damit die schleife weiterläuft - ist das so auch der fall oder wird nur el < maxnew ausgewertet?
-
Beim && und beim || Operator gibt es die Besonderheit, dass die zweite Bedingung nur ausgewertet wird, wenn durch die erste Bedingung das Ergebnis nicht schon feststeht. Denn false && X ist immer false, und true || X ist immer true. Soviel dazu, das ist hier aber nach deiner Beschreibung nicht das Problem. Versuchs mal mit einer anständigen Fehlerbeschreibung.
-
@gast_xy
Selbstverständlich wird der gesamte Ausdruck ausgewertet. Allerdings mit den Einschränkungen die Bashar erwähnt.
Deine beiden Code-Schnipsel stellen schlicht nicht dieselbe Programm-Logik dar.
Damit die for-Schleife mit dem && im Falle von (e1 < len) auch abbricht, müsste der Ausdruck so lauten:
((el < maxnew) && (el >= len))
-
Das ist bei Logikoperatoren einfach so.
Warum sollte man einen Ausdruck komplett auswerten wenn er nie mehr wahr werden kann?UND: Abbruch sobald EINE Bedingung unwahr wird - Rückgabe ist dann false (0). Da ja ALLE wahr sein müssen um true (1) liefern zu können.
ODER: Abbruch sobald nur EINE Bedingung wahr ist. Rückgabe ist true (1). Der Rest der ODER interessiert nicht, es ist doch schon wahr.
Das ist auch das Problem bei langen Bedingungen die mit verschiedenen Operatoren arbeiten, zu erkennen wo der Abbruch statt findet.
a < b && a > c || b > c && a == b && b == c || a == c || x != cWie übersichtlich. Auch wenn es Regeln dafür gibt, ätzend.