static int?
-
Wir eine statische variable beim Programmstart autoamtisch auf 0 gesetzt?
-
Nein.
-
Beim Start möglicherweise nicht, aber beim ersten Mal, wenn du an ihrer Definition vorbeikommst.
-
ah versteh, und wenn er das zweite mal an der definition vorbeikommt behält sie ihren aktuellen wert!
-
BorisDieKlinge schrieb:
ah versteh, und wenn er das zweite mal an der definition vorbeikommt behält sie ihren aktuellen wert!
Ja, das ist ja der Vorteil der statischen Variablen.
(nur für die **** - wenn du die Variable selber initialisierst, wird sie natürlich nicht vorher mit 0 gefüllt, sondern gleich mit dem angegebenen Wert)
-
klingt logisch;)
-
keine Ahnung was du vohast, aber ich rate davon ab, statische Variablen zu benutzen, denn sie sind nicht thread-sicher und da kann es viel Ärger geben.
-
CStoll schrieb:
Beim Start möglicherweise nicht, aber beim ersten Mal, wenn du an ihrer Definition vorbeikommst.
doch, vor dem start. sonst müsste ja noch irgendwo ein verstecktes flag sein 'erster zugriff oder nicht'.
-
Nein, wenn die betroffene Funktion gar nicht aufgerufen wird, werden die statischen Variablen auch nicht initialisiert. (fällt in C vielleicht nicht so sehr auf - weil du die Existenz der Variable nicht erkennen kannst, ohne ihre Funktion aufzurufen, aber in C++ macht sich der Unterschied deutlicher bemerkbar).
-
CStoll schrieb:
Nein, wenn die betroffene Funktion gar nicht aufgerufen wird, werden die statischen Variablen auch nicht initialisiert.
wenn die funktion niemals aufgerufen oder sonst nie referenziert wird (z.b. über function pointer), dann steckt sie erst gar nicht erst im binary (kannste z.b. mit 'nem linker-map file nachprüfen) und statische/globale variablen ebenfalls nicht (mit ausnahme von 'volatiles'). ansonsten werden globale und statische variablen noch *vor* dem aufruf von 'main' initialisiert. jedenfalls kenne ich keinen compiler, der's tatsächlich erst *beim* ersten zugriff macht.
CStoll schrieb:
...aber in C++ macht sich der Unterschied deutlicher bemerkbar
na, das kann schon sein. warum auch immer.
-
Bouncer schrieb:
CStoll schrieb:
Nein, wenn die betroffene Funktion gar nicht aufgerufen wird, werden die statischen Variablen auch nicht initialisiert.
wenn die funktion niemals aufgerufen oder sonst nie referenziert wird (z.b. über function pointer), dann steckt sie erst gar nicht erst im binary (kannste z.b. mit 'nem linker-map file nachprüfen) und statische/globale variablen ebenfalls nicht (mit ausnahme von 'volatiles'). ansonsten werden globale und statische variablen noch *vor* dem aufruf von 'main' initialisiert. jedenfalls kenne ich keinen compiler, der's tatsächlich erst *beim* ersten zugriff macht.
Es ist ja nicht immer so, daß eine Funktion nie aufgerufen wird. Aber es kann durchaus vorkommen, daß sie bei einem bestimmten Programmlauf nicht aufgerufen wird - und dann steht sie trotzdem im Binary.
CStoll schrieb:
...aber in C++ macht sich der Unterschied deutlicher bemerkbar
na, das kann schon sein. warum auch immer.
In C++ kannst du zumindest besser verfolgen, wann ein gegebenes Objekt initialisiert wird - also fällt da der Unterschied schon auf. Und zumindest aus C++ weiß ich, daß statische Variablen beim ersten Aufruf ihrer Funktion initialisiert werden.
(btw, der Initialierungswert einer Variable kann erst zur Laufzeit festgelegt werden - wie willst du sie da schon bei Programmstart befüllen?)
-
CStoll schrieb:
(btw, der Initialierungswert einer Variable kann erst zur Laufzeit festgelegt werden - wie willst du sie da schon bei Programmstart befüllen?)
nur bei nicht-statischen variablen, static und globale variablen dürfen nur mit konstanten initialisiert werden.
void f (void) { int a = g(); // ok, a ist nicht static static int b = g(); // error, rückgabewerte von funktionen sind nicht konstant ... }
-
Also das erstaunt mich jetzt aber - wo man doch in C sogar die Größe eines Arrays zur Laufzeit bestimmen kann.
PS: Aber ich bleib doch lieber bei C++.
-
CStoll schrieb:
Also das erstaunt mich jetzt aber - wo man doch in C sogar die Größe eines Arrays zur Laufzeit bestimmen kann.
Eines Arrays auf dem Stack. Hier geht es um static.
-
CStoll schrieb:
Also das erstaunt mich jetzt aber - wo man doch in C sogar die Größe eines Arrays zur Laufzeit bestimmen kann.
auch nicht im global scope. (edit: steht ja schon da)
CStoll schrieb:
PS: Aber ich bleib doch lieber bei C++.
mach doch :p in C++ sind ja alle erdenklichen schweinereien möglich.
-
Bouncer schrieb:
in C++ sind ja alle erdenklichen schweinereien möglich.
In C auch - und im Gegensatz zu C können wir diese "Schweinereien" sogar vor den Anwendern verbergen.
-
CStoll schrieb:
Bouncer schrieb:
in C++ sind ja alle erdenklichen schweinereien möglich.
In C auch - und im Gegensatz zu C können wir diese "Schweinereien" sogar vor den Anwendern verbergen.
ja, aber in C kann man irgendwelche schweinereien nur mit wirkilch böser absicht machen - und - man kann sie nicht vererben
-
Soll ich mit-oder zumachen?
-
Tim schrieb:
...oder zumachen?
was missfällt dir? ist doch alles chillig hier...
-
Ich lese zuviel "C vs C++".