Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
|
31.10.12, 11:30
|
#1
|
BoZz
Registriert seit: Nov 2009
Beiträge: 39
Bedankt: 5
|
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
|
|
|
31.10.12, 13:20
|
#2
|
bla
Registriert seit: Mar 2010
Beiträge: 313
Bedankt: 302
|
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.
|
|
|
01.11.12, 01:49
|
#3
|
BoZz
Registriert seit: Nov 2009
Beiträge: 39
Bedankt: 5
|
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:
Zitat von germgerm
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.
|
Was kann ich mir denn jetzt da drunter vorstellen? :x
int sib;
if(!sib)
... true
Wieso stimmt dann die Bedingung? Und muss man diese jetzt am Anfang definieren oder nicht >.<
|
|
|
01.11.12, 08:50
|
#4
|
bla
Registriert seit: Mar 2010
Beiträge: 313
Bedankt: 302
|
Zitat:
Zitat von TehEbil
Was kann ich mir denn jetzt da drunter vorstellen? :x
int sib;
if(!sib)
... true
Wieso stimmt dann die Bedingung? Und muss man diese jetzt am Anfang definieren oder nicht >.<
|
Diese Bedingung stimmt nur zufällig.
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:
{ int iWine=67; } // end of scope - iWine destroyed { int iBeer = 0; // declaration including initialization iBeer = 500; }
|
|
|
31.10.12, 15:13
|
#5
|
Erfahrenes Mitglied
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
|
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.
|
|
|
31.10.12, 19:54
|
#6
|
Anfänger
Registriert seit: Apr 2010
Beiträge: 20
Bedankt: 14
|
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!
|
|
|
31.10.12, 20:31
|
#7
|
Banned
Registriert seit: Mar 2012
Beiträge: 337
Bedankt: 93
|
Zitat:
Zitat von weinixxl
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!
|
Das ist absoluter Blödsinn!
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?
|
|
|
01.11.12, 00:25
|
#8
|
bla
Registriert seit: Mar 2010
Beiträge: 313
Bedankt: 302
|
Zitat:
Zitat von weinixxl
...oder, noch schlimmer, der gar nicht existiert -> Absturz!
|
Auto-Variable liegt im Stack, muss also unabhängig vom Initialisieren existieren.
Und ja, ich gehe noch immer davon aus, dass wir von C sprechen.
|
|
|
01.11.12, 15:59
|
#9
|
Erfahrenes Mitglied
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
|
"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 ... .
|
|
|
02.11.12, 17:47
|
#10
|
BoZz
Registriert seit: Nov 2009
Beiträge: 39
Bedankt: 5
|
Okay, danke
|
|
|
07.11.12, 20:10
|
#11
|
Anfänger
Registriert seit: Oct 2010
Beiträge: 1
Bedankt: 0
|
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.
|
|
|
07.11.12, 21:56
|
#12
|
Erfahrenes Mitglied
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
|
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 ...
|
|
|
08.11.12, 08:32
|
#13
|
Banned
Registriert seit: Aug 2012
Beiträge: 223
Bedankt: 68
|
@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!
|
|
|
08.11.12, 17:35
|
#14
|
Erfahrenes Mitglied
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
|
@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.
|
|
|
08.11.12, 18:59
|
#15
|
Banned
Registriert seit: Mar 2012
Beiträge: 337
Bedankt: 93
|
Zitat:
Zitat von slahn
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.
|
Ganz klar NEIN!
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".
|
|
|
08.11.12, 19:48
|
#16
|
Anfänger
Registriert seit: Apr 2010
Beiträge: 22
Bedankt: 9
|
Eine direkte Deklaration&initalisierung einer Variable ist sinnvoll wen der "Standartwert" bekannt ist. Dieser Standartwert kann auch 0.0 sein.
|
|
|
08.11.12, 19:45
|
#17
|
Erfahrenes Mitglied
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
|
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:
...
int MODUS = 0;
int main() {
switch(MODUS) {
case 0: ... break;
case 1: ... break;
default: ...
}
return 1;
}
Hier das geforderte "Beispiel" (so wie ich es meine; über die Nützlichkeit kann gestritten werden, muss aber nicht ). Es wäre ein wenig unvorsichtig hier her zu gehen und zu sagen:"Es wird ja eh automatisch MODUS mit 0 vorbelegt (da global und damit static) warum also extra hinschreiben ...". Klar wird es Funktionieren, aber es hat auch keine wirklichen Vorteile (die zwei Zeichen zu tippen sind eine schlechte Ausrede). Die Nachteile sind aber, dass es ein wenig Unübersichtlicher ist (z.B. nicht jeder versteht gleich, dass MODUS hier 0 ist) und es ist nicht für alle Zeiten sicher, dass sich das verhalten nicht ändert.
|
|
|
08.11.12, 19:51
|
#18
|
Hinter dir!
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
|
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.
|
|
|
09.11.12, 06:48
|
#19
|
bla
Registriert seit: Mar 2010
Beiträge: 313
Bedankt: 302
|
Zitat:
Zitat von Your_Conscience
oder das Programm stürzt beim Vergleich einer uninitialisierten Varible ab.
|
Das würde ich gerne sehen.
|
|
|
09.11.12, 07:45
|
#20
|
Hinter dir!
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
|
Zitat:
Zitat von germgerm
Das würde ich gerne sehen.
|
Probier selbst aus was passiert.
Außerdem habe ich nicht gesagt, dass das passieren muss. Aber falls nicht wird make definitiv meckern.
|
|
|
09.11.12, 09:27
|
#21
|
Erfahrenes Mitglied
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
|
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)
|
|
|
09.11.12, 10:18
|
#22
|
Hinter dir!
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
|
Ich habe es mal getestet und make meckert (-Wall), funktionieren tut das Programm aber trotsdem, stürzt also nicht ab.
|
|
|
09.11.12, 13:29
|
#23
|
Erfahrenes Mitglied
Registriert seit: Oct 2009
Beiträge: 640
Bedankt: 228
|
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 ...
|
|
|
09.11.12, 14:49
|
#24
|
Hinter dir!
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
|
Zitat:
Zitat von slahn
Meckern tut er, weil es einfach ein Schwachsinn [...] ist, eine uninitialisierte Variable zu verwenden ...
|
Naja, darum ging es ja eigentlich auch.
|
|
|
09.11.12, 18:51
|
#25
|
bla
Registriert seit: Mar 2010
Beiträge: 313
Bedankt: 302
|
Zitat:
Zitat von Your_Conscience
Naja, darum ging es ja eigentlich auch.
|
Genau meine Meinung.
|
|
|
17.11.12, 10:32
|
#26
|
Anfänger
Registriert seit: Oct 2010
Beiträge: 42
Bedankt: 33
|
Mit 0 oder sonstwas vorinitialisieren und gut ist, mein Gott - was ihr für Probleme habt
|
|
|
Forumregeln
|
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr.
().
|