4 Stimmen

Statische Variablen in C++

Ich bin heute auf ein interessantes Problem gestoßen. Sehen Sie sich diesen Pseudocode an:

void Loop()
{
   static int x = 1;
   printf("%d", x);
   x++;
}

void main(void)
{
    while(true)
    {
       Loop();
    }
}

Obwohl x statisch ist, warum gibt dieser Code nicht einfach jedes Mal "1" aus? Ich reinitialisiere x auf 1 auf jeder Iteration, bevor ich es drucken. Aber aus welchem Grund auch immer, x inkrementiert wie erwartet.

9voto

Garo Yeriazarian Punkte 2503

Die Initialisierung einer statischen Variablen erfolgt nur beim ersten Mal. Danach wird die Instanz bei allen Aufrufen der Funktion gemeinsam genutzt.

3voto

Tim Robinson Punkte 51702

Ich setze x bei jeder Iteration auf 1 zurück

Nein, das tun Sie nicht: Sie initialisieren ihn auf 1, aber er wird nur einmal initialisiert.

1voto

static bedeutet nicht const .

Von MSDN:

Wenn eine Variable geändert wird, wird die statische Schlüsselwort an, dass die Variable eine statische Dauer hat (sie wird zugewiesen wenn das Programm beginnt und freigegeben, wenn das Programm endet) und initialisiert ihn auf 0, sofern kein anderer Wert angegeben wird. Beim Ändern einer Variable oder Funktion im Bereich der Datei, gibt das Schlüsselwort static an, dass die Variable oder Funktion eine interne Verknüpfung hat (ihr Name ist nicht sichtbar von außerhalb der Datei, in der sie deklariert ist deklariert ist).

Eine als statisch deklarierte Variable in einer Funktion deklarierte Variable behält ihren Zustand zwischen Aufrufen dieser Funktion.

Beim Ändern eines Datenelements in einer Klassendeklaration, gibt das Schlüsselwort static an, dass eine Kopie des Elements gemeinsam von allen Instanzen der Klasse geteilt wird. Beim Ändern eines Elements Funktion in einer Klassendeklaration wird mit dem static-Schlüsselwort an, dass die Funktion nur auf statische Mitglieder zugreift.

Der Wert von static wird zwischen den einzelnen Funktionsaufrufen beibehalten so zum Beispiel (wieder von MSDN):

// static1.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
void showstat( int curr ) {
   static int nStatic;    // Value of nStatic is retained
                          // between each function call
   nStatic += curr;
   cout << "nStatic is " << nStatic << endl;
}

int main() {
   for ( int i = 0; i < 5; i++ )
      showstat( i );
}

In Ihrem Beispiel wird x wie erwartet inkrementiert, denn der Wert ist beibehalten .

1voto

AndersK Punkte 34870

Statisch bedeutet in diesem Zusammenhang, dass der Wert zwischen Aufrufen der Funktion beibehalten werden sollte. die Initialisierung erfolgt nur einmal.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X