![]() |
Delphi-Version: 10.4 Sydney
Schleife von 0 bis Count-1 mit Änderung
Mal eine grundsätzliche Frage, ob dies per Definition so ist und sich auch nicht ändert.
Eine Schleife durch eine Liste in der die Liste selbst geändert wird.
Delphi-Quellcode:
Das Ergebnis ist
var
sl : TStringlist; i : Integer; begin sl := TStringlist.Create; sl.Add('eins'); sl.Add('zwei'); sl.Add('drei'); for i := 0 to sl.Count-1 do sl.Add(i.ToString); sl.Free; eins zwei drei 0 1 2 und die Schleife wird auch beendet. Ich habe die Anzahl innerhalb der Schleife geändert, also wird der Wert "Count" beim Start gesichert und benutzt. Kann man sich darauf verlassen, dass das immer so ist? (Also ein Funktionsaufruf, der die Durchlaufanzahl liefert würde immer nur genau einmal aufgerufen.) |
AW: Schleife von 0 bis Count-1 mit Änderung
Ja, ist seit Anbeginn der Zeit so und wird sich (wohl) nicht mehr ändern.*
*für die bisherigen Compiler (Win32/64) |
AW: Schleife von 0 bis Count-1 mit Änderung
Rtfm :-)
|
AW: Schleife von 0 bis Count-1 mit Änderung
Ja, das ist exakt schon immer das übliche Vorgehen beim Durchiterieren einer Liste. Aber Achtung! Sollte im Rahmen der Schleife ein Element gelöscht werden dann rückwärts durchlaufen. Es verändert sich ja beim Löschen die Anzahl der Elemente, und dann kracht es, weil das „Count-1“ zu Beginn unverändert bleibt und hinten raus die Elemente in der Liste nach vorne verschoben werden.
|
AW: Schleife von 0 bis Count-1 mit Änderung
Zitat:
|
AW: Schleife von 0 bis Count-1 mit Änderung
Ja, dieses Verhalten ist für for-Schleifen definiert, deshalb sind diese auch schneller.
Der Compiler optimiert Schleifen nach Möglichkeit so, dass gegen 0 gezählt wird. Das spart noch mal einen Vergleich je Durchlauf, das sieht dann übersetzt im Prinzip so aus:
Delphi-Quellcode:
n := sl.Count - 1;
for i := n downto 0 do sl.Add((n - i).ToString); |
AW: Schleife von 0 bis Count-1 mit Änderung
Nochmals RTFM. Da muss man kein Compiler experte sein sondern nur lesen können :-P
"For purposes of controlling the execution of the loop, the expressions initialValue and finalValue are evaluated only once, before the loop begins." |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz