![]() |
Welchen Wert hat ein undefiniertes Integer?
Moin,
welchen Wert hat int i; ? Wenn man es ausgibt, könnte false und 0 rauskommen. Auch Null ziehe ich in Erwägung. Was ist denn jetzt richtig? Ein Professor meinte zu meinem Kollegen, es ist irgendein Wert zwischen -2.147 ... und 2.147 - das hilft mir aber auch nicht wirklich weiter.. mfg |
Du wirst dich wundern, aber der Professor hat recht.
Wenn dein nicht initialisierter Integer 4 Byte Speicher belegt, steht irgendwas zwischen −2.147.483.648 und 2.147.483.647 drin. |
Also so pauschal kann man das jetzt nicht sagen ... es kommt auf die Programmiersprache drauf an und was in dessen Standard steht. Bei Java z.B. wird jeder primitive Datentyp mit 0 (bei boolean eben false) initialisiert.
Manche Compiler initialisieren im Debugging-Modus Variablen auch auf 0 vor ... [Edit: Anscheinend ist es wohl eher anders rum (bei gcc) ... aber egal, wichtig ist, dass es möglich ist, dass manchmal Werte unerwartet initialisiert werden können] Somit ist das eine Frage, die man nur damit beantworten kann, dass man im Sprachstandard nachliest, bzw. noch besser in der Dokumentation des jeweiligen Compilers. Denn es gibt keine 100% richtige Antwort. |
Genau so sieht es aus! Deshalb ist es auch so wichtig Variablen vor gebrauch zu initialisieren, damit du nicht auf Speicher zugreifst in dem Müll steht oder, noch schlimmer, der gar nicht existiert -> Absturz!
|
Zitat:
Wenn eine Variable unbestimmt ist, dann macht es absolut keinen Sinn diese mit irgendeinem Wert zu initialisieren! Welchen Sinn soll das bitte haben? Sollen Berechnungen dann lieber total falsche Ergebnisse liefern anstatt, dass ein ordentliches Error-Handling implementiert wird? Exceptions sind Teil der Programmierung, und wenn eine Eingabe ungültig ist, dann wird eine Exception geworfen anstatt IRGENDWAS auszugeben! Mit welchem Wert willst Du bitte einen Kontostand initialisieren? |
Zitat:
Und ja, ich gehe noch immer davon aus, dass wir von C sprechen. |
Sorry, hatte vergessen zu erwähnen, dass es sich bei der Frage hauptsächlich um C / C++ handelt. Dennoch gut zu wissen, dass die Compiler hierbei unterschiedlich handeln.
Zitat:
int sib; if(!sib) ... true Wieso stimmt dann die Bedingung? Und muss man diese jetzt am Anfang definieren oder nicht >.< |
Zitat:
Mich wundert aber, dass dein Compiler sich nicht beschwert und eine Warnung ausgibt. Wenn du ein Bier trinken gehst, möchtest du wahrscheinlich auch ein frisch ausgewaschenes Glas (auf 0 initialisiert). Dann wird ein Bier eingeschenkt (500 ml). Sonst würdest einfach den Rest vom Vortrinker bekommen (zufälligerweise 67ml Wein). PHP-Code:
|
"if" bei INT ist immer dann Wahr, wenn die Zahl nicht 0 ist. Da jetzt ein zufälliger Wert drin steht, sind die Chancen höher dass nicht 0 raus kommt, als 0 (sollte wohl logisch sein, da es viel mehr werte gibt, die nicht 0 sind). Aber beim X-ten versuch kann dein Programm auch false zurück geben.
Bei C/C++ ist es so, dass die Variable (ohne explizite Zuweisung) den Wert annimmt, der zuvor in der Speicherzelle gestanden ist (somit zufällig ist). Aber wie auch schon erwähnt, kann der Compilerhersteller sagen er "weicht" ein wenig vom Standard ab und und initialisiert immer auf 0 (der Standard gibt nur vor, dass es eine unbestimmte Zahl im kompletten Zahlenbereich, welche von der Bitlänge abgedeckt wird, sein kann; ist kein Zitat, sonder nur meine eigenen Worte). Aber man kann es eben nie so wirklich genau sagen (weil es eben Compiler abhängig ist. Jedoch ist es immer ein nach dem Standard gültiger Int-Wert, also nichts mit Absturz oder so ... . |
Okay, danke ;)
|
Nein das stimmt bei C/C++ nicht ganz, globale Variablen, ausserhalb einer Funktionsdefinition werden tatsächlich mit 0 vorbelegt. Variablen in Blöcken, Funktionen etc. sind unbestimmt.
|
Ja ok, der Standard für C/C++ sieht vor, dass statische Variablen mit 0 oder NULL vorbelegt werden ... Also werden globale Variablen (dort wird implizit static verwendet) oder Variablen mit dem Schlüsselwort static, mit 0 (oder bei Pointern mit NULL; was aber auch 0 sein kann ... aber da kommen wir jetzt vom hundertsten ins tausendste ...) vorbelegt.
Bei mir geht gcc (Version 4.4.5 [Debian]) sogar her und zeigt das selbe verhalten auch für Variablen, die in der main() definiert wurden (ohne static). Also auch alle uninitialisierten Variablen innerhalb von main() werden mit 0 vorbelegt. Nur Variablen in Funktionen sind unbestimmt. Aber nur wenn ich NICHT im Debugging-Modus bin ... Somit ist das ganze gar nicht immer so leicht zu sagen sagen ... besser man initialisiert immer (vor der Verwendung; also alles außer Zuweisungen ;)) und verlässt sich nicht auf Rätselraten. Denn bei einem anderen Compiler, einer anderen Einstellung oder einer anderen Version kann alles wieder ganz anders aussehen ... |
@slahn
Immer initialisieren ist absolut falsch! Was ist wenn - wie der Kollege oben schon anmerkte - man eine Bankingsoftware entwickelt und ein Kontostand dargestellt werden soll? Ein Kunde ist nun mit 1000000€ in der Miese, die Verbindung zum Dienst kann nicht aufgenommen werden und vorsichtshalber wird der Kontostand nun mit 0€ initialisiert. Resultat: Kündigung des Entwicklers! Das was du als Rätselraten bezeichnest, kann in einer sauberen Architektur gar nicht vorkommen! |
@NetWebs: Ich habe gesagt man soll vor der Verwendung (ja ich weiß es steht in der Klammer, aber es gehört auch zum Text dazu) initialisieren (und das muss dann nicht unbedingt 0 sein). Und mit Rätselraten meinte ich, dass man nicht hergeht und sagt, die Variable wird (hoffentlich) schon automatisch mit 0 initialisiert werden, also muss ich das nicht tun und lasse Initialisierungen auf den Wert 0 einfach weg.
Das Konto Beispiel halte ich sowieso für etwas "dämlich" (Entschuldigung für die Ausdrucksweise) gewählt. Wie wir gesehen haben, gibt es Sprachen und Compiler (Java macht bei int z.B. immer 0), welche sowieso einen bestimmten Wert Initialisiert. Zudem ist auch ein zufälliger Wert nicht besser (denn ich werde noch viel schneller entlassen, wenn ein Kunde plötzlich 4275319€ am Konto hat oder der Kunde wird sauer sein, wenn er einfach so -2686761€ am Konto sieht). Zudem hat er den Stand ja nicht wirklich, da er ja keine Verbindung zum Bankserver herstellen konnte, also sieht er das höchstens am Bankautomaten (also eher ein Anzeigefehler den er nie sehen sollte, da ohne Verbindung sowieso nichts funktioniert (zumindest sollte es so sein). Also viel "blub blub" um nichts (bzw. der Fehler liegt an einer anderen stelle und nicht beim Initialisieren/Zusweisen) ... Die Variable darf gar nicht verwendet werden und der Bankautomat sollte anzeigen, dass er leider keine Verbindung herstellen kann ... Sorry für OT, wollte aber nur klar stellen, dass es schon gut ist eine Variable VOR dem VERWENDEN (also Berechnungen oder Ausgaben) zu initialisieren. |
Zitat:
Es gibt KEINEN Fall in dem dies sinnvoll ist! Einer Variable irgendeinen Wert zu zuweisen kann NIEMALS gut sein. Ansonsten erleuchte uns bitte und nenne ein Muster in dem es "gut" ist einer Variable IRGENDEIENEN Wert zu zuweisen! Daher ist Deine ganze Antwort ein großes "Blub blub". |
Wir reden anscheinend noch immer aneinander vorbei :). Ich meinte niemals einfach irgendeinen Wert zu nehmen. Ich bin stark dafür erst dann zu Initialisieren, wenn es wirklich notwendig ist (darum mag ich den Ansatz von Java nicht, wo z.B. auch in einem Konstruktor zuerst immer alles vorbelegt wird ... aber das ist eine andere Geschichte). Aber BEVOR man eine Variable VERWENDET, muss sie explizit (und auf keinen Fall implizit) initialisiert sein.
Code:
... |
Eine direkte Deklaration&initalisierung einer Variable ist sinnvoll wen der "Standartwert" bekannt ist. Dieser Standartwert kann auch 0.0 sein.
|
Was wird denn hier rumgespannt und diskutiert wo es nichts zu diskutieren gibt?
Deklariert man eine Variable ist dies nur der Name für eine Adresse im Speicher. Wird der Variable beim initialisieren kein Wert zugewiesen, bleibt bei den meisten Compilern das im Speicher, was vorher schon drin stand. Bei 32 Bit ist es ein Wert von -2.147.483.648 bis 2.147.483.647, bei 64 Bit von -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807. Wer sich selbst überzeugen will wie es bei seinem Compiler ist, soll es einfach schnell selbst testen, dauert keine Minute. Wenn es der Compiler nicht macht sollte es der Programmierer tun, das ist einfach "guter" Programmierstil und beugt Fehler vor. Und ich bilde mir ein, dass ANSI C nicht mit uninitialisierten Variablen klar kommt. Ich bin mir nicht sicher, aber entweder meckert make (unsauberer Stil) und/oder das Programm stürzt beim Vergleich einer uninitialisierten Varible ab. |
Zitat:
|
Zitat:
Außerdem habe ich nicht gesagt, dass das passieren muss. Aber falls nicht wird make definitiv meckern. |
make hat keinen Grund zu meckern (es führt ja nur unterschiedliche Befehle/Tools, nach gewissen Regeln aus) ... wenn dann meinst du eher den Compiler (z.B. gcc) ;)
|
Ich habe es mal getestet und make meckert (-Wall), funktionieren tut das Programm aber trotsdem, stürzt also nicht ab.
|
Aber trotzdem meckert da nicht make, sondern in deinem Fall wahrscheinlich gcc ... make kann nicht kompilieren ... es führt dazu Programme aus, wie z.B. gcc. Aber egal ... lassen wir das :)
Meckern tut er, weil es einfach ein Schwachsinn (ok, ein paar Algorithmen verwenden es zur Initialisierung einer Randomfunktion, aber sonst fällt mir nicht wirklich ein nützlicher Einsatzfall ein) ist, eine uninitialisierte Variable zu verwenden ... |
Zitat:
|
Zitat:
|
Mit 0 oder sonstwas vorinitialisieren und gut ist, mein Gott - was ihr für Probleme habt
:rolleyes: :D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:43 Uhr. |
Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.