Im folgenden Beispiel -
%Vor%Die Ausgabe kommt als -
[21] 21
[22] 21
[23] 21
Was ist der Grund, warum result
value bei nachfolgenden Aufrufen an dieselbe Funktion nicht geändert wird? Ich habe auch die Ausgabe der Variable a
gedruckt, die sicherlich inkrementiert wird und da es auch statisch ist, dürfen nicht mehrere Kopien für dieselbe Methode existieren.
Die const
stören hier nur den Leser von der wahren Ursache. Dieser Code führt genau das gleiche aus.
Der wahre Grund ist, dass das =
-Zeichen zwei verschiedene Operationen in C ++ darstellen kann: eine Zuweisung (jedes Mal ausgeführt) oder eine Initialisierung (wird nur ausgeführt, wenn die Variable erstellt wird). Der Unterschied, wenn es Teil der Deklaration / Definition der Variablen ist.
Im normalen Kontext (nicht statische Blockvariablen) sind beide gleich, da eine automatische Variable jedes Mal erstellt wird, wenn der Block deklariert wird (oder zumindest muss der Compiler sicherstellen, dass sich alle als ob
Aber für eine statische Blockvariable tritt die Initialisierung nur einmal auf und hier wird das variable Ergebnis auf 21 initialisiert und sein Wert wird sich niemals ändern.
Diese Varianten wären sehr verschieden
%Vor% Da result
statisch ist, wird es nur einmal zur Laufzeit initialisiert. Daher wird die folgende Zeile nur einmal ausgeführt, egal wie oft someMethod()
Static ist ein Hinweis für den Compiler, eine Variable nicht neu zu initialisieren, abgesehen davon, dass der Compiler gezwungen wird, den Wert der Variablen dem Datensegment des Programms zuzuordnen.
Wie von anderen erläutert, ist result
eine static
Variable, so dass sie nur bei der ersten Ausführung von someMethod()
initialisiert wird.
Und result
ist auch const
, also der erste Wert, der mit
bleibt für die folgende Ausführung des Programms unverändert.
Ich nehme an, Sie haben etwas erwartet, das mit einer Referenz erreichbar ist; wenn Sie die vorhergehende Zeile wie folgt ändern
%Vor% Sie verknüpfen result
mit a
und ändern a
mit result
und die Ausgabe ist
Das Problem besteht darin, dass Sie eine Variable auf eine andere Variable und nicht auf einen Ausdruck verweisen können. Sie können also result
mit a
verbinden, nicht mit a+1
(nicht mit dem dynamischen Wert von a+1
); also die folgende Zeile
Kompiliere, aber (wenn ich nicht falsch liege) link result
mit der unbenannten Variable wo (bei der ersten Ausführung von someMethod()
) das Ergebnis des Ausdrucks a + 1
gespeichert wird, also ist die Ausgabe wieder