Was wird ausgedruckt? 6 6 oder 6 7? Und warum?
void foo()
{
static int x = 5;
x++;
printf("%d", x);
}
int main()
{
foo();
foo();
return 0;
}
Wadiklk
Was wird ausgedruckt? 6 6 oder 6 7? Und warum?
void foo()
{
static int x = 5;
x++;
printf("%d", x);
}
int main()
{
foo();
foo();
return 0;
}
Hier gibt es zwei Probleme, Lebensdauer und Geltungsbereich.
Der Gültigkeitsbereich der Variable ist dort, wo der Variablenname zu sehen ist. Hier, x
ist nur innerhalb der Funktion sichtbar foo()
.
Die Lebensdauer einer Variablen ist der Zeitraum, in dem sie existiert. Wenn x
wurden ohne das Schlüsselwort definiert static
die Lebensdauer wäre vom Eintritt in foo()
zur Rücksendung von foo()
; es würde also bei jedem Anruf auf 5 neu initialisiert werden.
Das Schlüsselwort static
Maßnahmen zur Verlängerung der Lebensdauer einer Variablen auf die Lebensdauer des Programms; zB erfolgt die Initialisierung einmal und nur einmal und dann behält die Variable ihren Wert – was auch immer sie geworden ist – über alle zukünftigen Aufrufe bei foo()
.
In welchen Szenarien müssen wir eine Variable innerhalb einer Funktion als statisch deklarieren?, nur neugierig zu wissen, da ich das noch nie benutzt habe?
– Okay
1. August 2018 um 11:54 Uhr
Ich würde mich bedanken, aber das wurde alles ganz oben auf der Seite beantwortet. Es bringt mich zum Lachen, dass die Leute nicht einfach ihren eigenen Code ausführen. xD
– Pfütze
22. Dezember 2018 um 21:58 Uhr
Diese Antwort ist falsch. In dem Moment, in dem Sie an rekursive Funktionen denken, erklären die hier beschriebenen Definitionen nicht das Verhalten!
– Philip Couling
3. Februar 2019 um 18:17 Uhr
Was passiert, wenn ich eine statische Variable deklariere und dann in einer separaten Zeile wie folgt initialisiere: static int a;
a = 0;
In diesem Fall würde a jedes Mal auf 0 zurückgesetzt werden. Ist das korrekt?
– Lakshya Goyal
31. März 2020 um 6:03 Uhr
@LakshyaGoyal Ihre zweite Zeile ist eine Anweisung, keine Initialisierung. Also ja, da hast du recht a
wäre jedes Mal Null (unmittelbar nachdem die 2. Zeile ausgeführt wurde). Dies würde natürlich wahrscheinlich die Vorteile der Verwendung einer statischen Variablen zunichte machen.
– Tyrel Kostyk
18. Dezember 2020 um 19:36 Uhr
Nitesh Borad
Ausgabe: 6 7
Grund: Statische Variable wird nur einmal initialisiert (im Gegensatz zur Auto-Variable) und eine weitere Definition der statischen Variable würde während der Laufzeit umgangen. Und wenn es nicht manuell initialisiert wird, wird es automatisch mit dem Wert 0 initialisiert. So,
void foo() {
static int x = 5; // assigns value of 5 only once
x++;
printf("%d", x);
}
int main() {
foo(); // x = 6
foo(); // x = 7
return 0;
}
Das ist dasselbe wie das folgende Programm:
static int x = 5;
void foo()
{
x++;
printf("%d", x);
}
int main()
{
foo();
foo();
return 0;
}
Alles, was das Schlüsselwort static in diesem Programm tut, ist, dass es dem Compiler (im Wesentlichen) mitteilt: „Hey, ich habe hier eine Variable, auf die niemand anderes zugreifen soll, sagen Sie niemandem, dass sie existiert“.
Innerhalb einer Methode teilt das Schlüsselwort static dem Compiler dasselbe wie oben mit, aber auch: „Sagen Sie niemandem, dass dies außerhalb dieser Funktion existiert, es sollte nur innerhalb dieser Funktion zugänglich sein“.
ich hoffe das hilft
Nun, es ist nicht wirklich dasselbe. Es gibt immer noch das Problem des Geltungsbereichs auf X. In diesem Beispiel könnten Sie damit herumstochern und herumfummeln x
hauptsächlich; es ist global. Im Originalbeispiel x
war lokal für foo, nur sichtbar, während man sich innerhalb dieses Blocks befindet, was ist allgemein vorzuziehen: wenn foo zu pflegen existiert x
auf vorhersehbare und sichtbare Weise, dann ist es im Allgemeinen gefährlich, andere daran stoßen zu lassen. Als weiterer Vorteil, es im Geltungsbereich zu halten foo()
Es hält auch foo()
tragbar.
– Benutzer2149140
16. Januar 2014 um 15:45 Uhr
@ user2149140 ‘sagen Sie niemandem, dass dies außerhalb dieser Funktion existiert, es sollte nur innerhalb dieser Funktion zugänglich sein’
– DCShannon
1. November 2015 um 22:09 Uhr
Während Sie das Problem des Bereichs aufgrund des Deklarationsorts der Variablen angesprochen haben, scheint die Beschreibung von static als Einfluss auf den Bereich und nicht auf die Lebensdauer falsch zu sein.
– DCShannon
1. November 2015 um 22:10 Uhr
@Chameleon Die Frage ist als markiert c
, also wäre Ihr Beispiel in diesem Zusammenhang auf globaler Ebene illegal. (C erfordert konstante Initialisierer für Globals, C++ nicht).
– Richard J.Ross III
26. Dezember 2018 um 19:00 Uhr
6 7
Der Compiler sorgt dafür, dass die statische Variableninitialisierung nicht jedes Mal erfolgt, wenn die Funktion eingegeben wird
Die Erklärung von x
ist drinnen foo
aber die x=5
Die Initialisierung erfolgt außerhalb von foo
!
Was wir hier verstehen müssen, ist das
static int x = 5;
ist nicht dasselbe wie
static int x;
x = 5;
Andere Antworten haben hier die wichtigen Wörter Umfang und Lebensdauer verwendet und darauf hingewiesen, dass der Umfang von x
ist ab dem Zeitpunkt seiner Deklaration in der Funktion foo
bis zum Ende der Funktion foo
. Zum Beispiel habe ich überprüft, indem ich die Deklaration an das Ende der Funktion verschoben habe, und das macht x
undeklariert bei der x++;
Aussage.
Also die static int x
(Geltungsbereich) Teil der Aussage gilt tatsächlich dort, wo Sie ihn irgendwo lesen INNERHALB der Funktion und erst ab da, nicht darüber innerhalb der Funktion.
Jedoch die x = 5
(lebenslang) Teil der Aussage ist Initialisierung der Variablen und passiert AUSSEN der Funktion im Rahmen des Programmladens. Variable x
wird mit einem Wert von geboren 5
wenn das Programm lädt.
Ich habe das in einem der Kommentare gelesen: “Außerdem spricht dies nicht den wirklich verwirrenden Teil an, nämlich die Tatsache, dass der Initialisierer bei nachfolgenden Aufrufen übersprungen wird.” Wird bei allen Aufrufen übersprungen. Die Initialisierung der Variablen liegt außerhalb des eigentlichen Funktionscodes.
Der Wert 5 wird theoretisch unabhängig davon gesetzt, ob foo aufgerufen wird oder nicht, obwohl ein Compiler die Funktion möglicherweise wegoptimiert, wenn Sie sie nirgendwo aufrufen. Der Wert 5 sollte in der Variablen stehen, bevor foo überhaupt aufgerufen wird.
Innen foo
die Aussage static int x = 5;
Es ist unwahrscheinlich, dass überhaupt Code generiert wird.
Ich habe die Adresse gefunden x
verwendet, wenn ich eine Funktion setze foo
in ein Programm von mir eingefügt und dann (korrekterweise) vermutet, dass dieselbe Stelle verwendet werden würde, wenn ich das Programm erneut ausführen würde. Der Teil-Screenshot unten zeigt das x
hat den Wert 5
schon vor dem ersten anruf foo
.
Eine statische Variable innerhalb einer Funktion hat eine Lebensdauer, solange Ihr Programm läuft. Es wird nicht jedes Mal zugewiesen, wenn Ihre Funktion aufgerufen wird, und nicht zugewiesen, wenn Ihre Funktion zurückkehrt.
Andreas Weiß
Lesen wir einfach die Wikipedia-Artikel über statische Variablen…
Statische lokale Variablen: Variablen, die innerhalb einer Funktion als statisch deklariert sind, werden statisch zugewiesen, während sie denselben Gültigkeitsbereich wie automatische lokale Variablen haben. Daher sind alle Werte, die die Funktion während eines Aufrufs in ihre statischen lokalen Variablen schreibt, immer noch vorhanden, wenn die Funktion erneut aufgerufen wird.
Das ist schrecklich! “Variablen, die innerhalb einer Funktion als statisch deklariert sind, werden statisch zugewiesen” – es erklärt nichts, es sei denn, Sie wissen bereits, was es bedeutet!
– Benutzer82238
17. Februar 2011 um 19:36 Uhr
@Blank: Nun, dafür dachte ich, der zweite Satz war dafür. Obwohl ich denke, dass Sie Recht haben, sollte es besser formuliert werden.
– Andreas Weiß
17. Februar 2011 um 19:43 Uhr
Außerdem spricht dies nicht den wirklich verwirrenden Teil an, nämlich die Tatsache, dass der Initialisierer bei nachfolgenden Aufrufen übersprungen wird.
– Tom Auger
14. November 2017 um 17:48 Uhr
Statisch zugewiesen bedeutet weder Stack noch Heap.
– Chamäleon
21. Dezember 2018 um 13:40 Uhr
Was ist das Problem zu versuchen?
– Andreas
17. Februar 2011 um 19:32 Uhr
Haben Sie versucht, dies einzugeben und selbst zu sehen?
– wilhelmtel
17. Februar 2011 um 19:32 Uhr
Ich möchte verstehen, warum.
– Wadiklk
17. Februar 2011 um 19:33 Uhr
@Vadiklk, also stelle die Frage, die mit “Warum” beginnt
– Andrej
17. Februar 2011 um 19:33 Uhr
ideone.com/t9Bbe Was würden Sie erwarten? Entspricht das Ergebnis nicht Ihren Erwartungen? Warum haben Sie Ihr Ergebnis erwartet?
– eckes
17. Februar 2011 um 19:34 Uhr