Was ist die Schleifenvariable nach einer For-Schleife in Delphi?

8

Betrachten Sie in Delphi

%Vor%

Man könnte denken, dass i = N nach der for -Schleife ist, aber garantiert der Delphi-Compiler das? Kann man annehmen, dass die Schleifenvariable innerhalb einer Schleife nach einer Delphi if Schleife gleich ihrem letzten Wert ist?

Aktualisieren

Nach ein paar einfachen Schleifen vermute ich, dass i tatsächlich gleich eins plus dem letzten Wert von i innerhalb der Schleife nach der Schleife ist ... Aber können Sie sich darauf verlassen das?

    
Andreas Rejbrand 09.04.2010, 21:01
quelle

6 Antworten

23

Nein, Delphi garantiert keinen Wert. Außerhalb der Schleife ist die Variable undefiniert - und IIRC der Language Guide dies ausdrücklich behaupten - das bedeutet, dass neuere Compiler-Implementierungen frei sind, um den Wert der Variablen außerhalb der Schleife aufgrund der tatsächlichen Implementierung zu ändern.

    
user160694 09.04.2010, 21:27
quelle
7

Der Compiler gibt tatsächlich eine Warnung aus, wenn Sie die Schleifenvariable nach der Schleife verwenden, also sollten Sie sie undefiniert betrachten.

    
Giel 09.04.2010 21:24
quelle
6

Ich würde vorschlagen, dass die Verwendung einer Schleife while ist klarer, wenn Sie den Schleifenindex nach der Schleife verwenden müssen:

%Vor%

Nachdem diese Schleife beendet ist, wissen Sie , dass i N + 1 ist (oder größer, wenn N kleiner als Null sein könnte).

    
Greg Hewgill 09.04.2010 21:05
quelle
2

Es ist sogar dokumentiert , dass die Loop-Variable von Eine for -Schleife ist außerhalb der Schleife nicht definiert.

In der Praxis: Was Sie von der Variablen erhalten, hängt von den Einstellungen des Compilers und der Komplexität des Codes ab. Ich habe gesehen, dass Änderungen im Code den Compiler in einen anderen Optimierungspfad schieben und somit den Wert dieser undefinierten Variablen verändern.

- Jeroen

    
Jeroen Wiert Pluimers 09.04.2010 21:42
quelle
1

Wie viele Leute sagten, soll die I-Variable nach der Schleife undefiniert sein. In der realen Welt wird es auf den letzten Wert definiert, den es hatte, bevor Sie "brechen", oder auf N + 1, wenn die Schleife von einem Lauf zum anderen läuft. Auf dieses Verhalten kann man sich jedoch nicht verlassen, da es eindeutig spezifiziert ist, dass es nicht funktionieren soll.

Manchmal wird I auch nicht zugewiesen. Ich habe dieses Verhalten hauptsächlich bei aktivierter Optimierung festgestellt.

Für Code wie diesen

%Vor%

Also ... Wenn Sie den Wert von I nach der Schleife wissen wollen, ist es besser, ihn einer anderen Variablen zuzuordnen, bevor Sie die Schleife verlassen.

    
Ken Bourassa 09.04.2010 21:45
quelle
1

VERWENDEN Sie NIEMALS den Wert der for-Variablen nach der Schleife.

Überprüfen Sie Ihre Compiler-Ausgabe. Der Delphi-Compiler warnt Sie davor. Vertraue deinem Compiler.

  1. Verstecken Sie niemals die Hinweise und Warnungen Ihres Compilers mit {$ Warnings off}!
  2. Lernen Sie, die Informationen als Warnungen und die Warnungen als Fehler zu behandeln!
  3. Optimieren Sie Ihren Code, bis Sie ZERO-Hinweise und Warnungen erhalten (ohne gegen Regel 1 zu verstoßen).
Sahara 27.05.2010 21:05
quelle

Tags und Links