globale und lokale Variablen
-
schliesse mich Alex an. meines wissens ist das lokale int nur in der forschleife gültig. und dort wird das globale durch das lokale "überdeckt"
-
Alex_H schrieb:
Lars Hupel schrieb:
cout << "i ist " << i << endl; // 16 ??? ... du hast i "überdeckt", sprich das lokale i verdeckt das globale
Bist du Dir an dieser Stelle sicher, das er auf das lokale i zugreift?
Eventuell ist es ja Compilerabhängig aber soweit ich weiß ist der Gültigkeitsraum von int i nach der for-Schleife zu Ende, und damit greift er auf das globale long i zu.Bsp:
void a_function() { for(int i=0; i<10;i++) i++; ShowMessage(i); //Fehlermeldung undefiniertes Symbol i }
Bei mir mit dem BCB6 kommt diese Fehlermeldung, ich glaube mich aber zu erinnern, daß das Bsp. bei VC++ so funktionieren sollte.
Gruß Alex
Es funktioniert beim VC++ 6. 'i' ist hier aber, wie schon gesagt, lokal zum
for-Body. Ausserhalb der for-Schleife kann nicht auf diese Variable zugegriffen
werden.mfg
v R
-
virtuell Realisticer schrieb:
[Ausserhalb der for-Schleife kann nicht auf diese Variable zugegriffenwerden.
Ist 'i' an dieser Stelle nicht schon außerhalb der for-Schleife? Irgendwie kann ich Dir da nicht folgen. Ich verstehe ja, das VC++ den Lebensbereich auf die ganze Funktion erweitert und damit das lokale 'i' anspricht, aber irgendwie wiederspricht dein Satz dem Rest oder habe ich irgendwas falsch verstanden?Gruß Alex
-
Alex_H schrieb:
virtuell Realisticer schrieb:
[Ausserhalb der for-Schleife kann nicht auf diese Variable zugegriffenwerden.
Ist 'i' an dieser Stelle nicht schon außerhalb der for-Schleife?Wenn du dich auf deinen letzten Code beziehst:
void a_function() { for(int i=0; i<10;i++) i++; //lokal zum for-rumpf ShowMessage(i); //lokal zum funktionsrumpf -> fehler: i nicht deklariert }
mfg
v R
-
Danke,
schlussendlich habe ichs auch verstanden, also läuft mein Bsp bei VC++ jedoch das hier nicht mehr.void a_function (){ if(true){ for(int i=0;i<10;i++) i++; } cout<<i<<endl; }
Wie sieht das eigentlich aus, wer ist da jetzt zum standard konform der BCB6 oder VC++?
Ich tendiere eher zum BCB aber vielleicht bin ich auch voreingenommen?Gruß Alex
-
Tag,
der VC++ _6_ verhaelt sich hier nicht korrekt. Bei den neuen Versionen ist das,
afair, nicht mehr so.mfg
v R
-
Variablen sollten, zwar mit kleinst moeglichem Scope deklariert werden aber meiner Meinung nach nicht in Schleifen(-koepfen).
-
PunI$0R schrieb:
Variablen sollten, zwar mit kleinst moeglichem Scope deklariert werden aber meiner Meinung nach nicht in Schleifen(-koepfen).
Das ist bloedsinn. Wenn ich 'i' ausserhalb der Schleife nicht benoetige, dann
brauch ich 'i' auch nicht in dem aeusseren Scope.mfg
v R
-
zu PunI$0R
Kannst Du das auch begründen, ich sehe keinen Grund das nicht zu tun, wenn ich die Variable nur innerhalb der Schleife benötige, warum dann nicht im Schleifenkopf deklarieren, dazu ist die erste Position in der for-Schleife doch da, zum deklarieren und initialisieren.Gruß Alex
Edit:virtuell Realisticer war da wohl schneller, dafür war meine Antwort diplomatischer.
-
Stimmt wohl, aber wenn ihr doch hier schon ueber unteschiedliches Verhalten von Kompilern und so disskutiert, dann wisst ihr ja schon den Hauptgrund. Man kann nicht immer genau sagen wie diese im Schleifenkopf deklarierten Variablen behandelt werden. Also ich versuche meinen Quellcode sicher, schnell und kompatibel zu schreiben. Das erreicht man nicht durch solch(meiner Meinung nach) seltsame Konstrukte. Dann doch lieber ein paar Zeilen mehr als undefiniertes Verhalten. Denk mal drueber nach..
-
PunI$0R schrieb:
Stimmt wohl, aber wenn ihr doch hier schon ueber unteschiedliches Verhalten von Kompilern und so disskutiert, dann wisst ihr ja schon den Hauptgrund. Man kann nicht immer genau sagen wie diese im Schleifenkopf deklarierten Variablen behandelt werden. Also ich versuche meinen Quellcode sicher, schnell und kompatibel zu schreiben. Das erreicht man nicht durch solch(meiner Meinung nach) seltsame Konstrukte. Dann doch lieber ein paar Zeilen mehr als undefiniertes Verhalten. Denk mal drueber nach..
Da braucht man nicht drueber nachzudenken. Es gibt kein UB. Der VC++ 6 laesst
es nunmal zu, ok. Jeder andere Compiler quitiert dir das mit einer Fehlermeldung,
so einfach ist das.mfg
v R
-
Das Default-Verhalten vom VC ist in der Tat nicht Standard-Konform, kann aber
per Kommandozeilen-Parameter konfiguriert werden.
-
Tja wer so programmieren will kann das gern tun, ich werde es auf keinen Fall machen, nicht fuer eine Zeile Code. Code von Leuten die in Schleifenkoepfen Variablen deklarieren, den ich gesehn hab, die haben auch sonst gut Scheisse gemacht und alles fuer due Unportierbarkeit und Inkompatibilitaet ihres programms getan. Ich kann so was nicht nachvollziehen.
-
PunI$0R schrieb:
Tja wer so programmieren will kann das gern tun, ich werde es auf keinen Fall machen, nicht fuer eine Zeile Code. Code von Leuten die in Schleifenkoepfen Variablen deklarieren, den ich gesehn hab, die haben auch sonst gut Scheisse gemacht und alles fuer due Unportierbarkeit und Inkompatibilitaet ihres programms getan. Ich kann so was nicht nachvollziehen.
Das eine hat mit dem anderen gar nichts zu tun.
mfg
v R
-
Wieso? Der Code wird durch solche Dinge nur unuebersichtlich. Zudem ist mir gerade eingefallen was mich noch so daran abgestossen hat. Du ueberlaesst es dem Kompiler ob die Variable nur in der For-Schleife oder auch ausserhalb gueltig ist. Das macht jeder Kompiler anders. Also ist es unschoen und inkompatibel.
-
PunI$0R schrieb:
Wieso? Der Code wird durch solche Dinge nur unuebersichtlich. Zudem ist mir gerade eingefallen was mich noch so daran abgestossen hat. Du ueberlaesst es dem Kompiler ob die Variable nur in der For-Schleife oder auch ausserhalb gueltig ist. Das macht jeder Kompiler anders. Also ist es unschoen und inkompatibel.
Das macht nicht jeder Compiler anders. Aber belassen wir es einfach dabei, dass
du es anders machst.mfg
v R
-
PunI$0R schrieb:
Wieso? Der Code wird durch solche Dinge nur unuebersichtlich. Zudem ist mir gerade eingefallen was mich noch so daran abgestossen hat. Du ueberlaesst es dem Kompiler ob die Variable nur in der For-Schleife oder auch ausserhalb gueltig ist. Das macht jeder Kompiler anders. Also ist es unschoen und inkompatibel.
dieses nicht-konforme verhalten ist im übrigen sehr leicht zu heilen:
#define for if(false);else for
der rest des (original-)codes hat ja schliesslich noch ganz andere probleme. der zugiff auf elemente ausserhalb der grenzen eines arrays ist undefiniertes verhalten.
-
BigNeal schrieb:
schliesse mich Alex an. meines wissens ist das lokale int nur in der forschleife gültig. und dort wird das globale durch das lokale "überdeckt"
ihr habt recht, schande über mich! das ist mir doch tatsächlich nicht aufgefallen.
-
PunI$0R schrieb:
Wieso? Der Code wird durch solche Dinge nur unuebersichtlich. Zudem ist mir gerade eingefallen was mich noch so daran abgestossen hat. Du ueberlaesst es dem Kompiler ob die Variable nur in der For-Schleife oder auch ausserhalb gueltig ist. Das macht jeder Kompiler anders. Also ist es unschoen und inkompatibel.
was ist übersichtlich?
for(int i = 0; i < 10; ++i) std::cout << i;
oder
{ int i; for(i=0; i < 10; ++i) std::cout << i; }
-
ich benutze schon immer lifes erste variante und kann nicht meckern. bis jetzt gab es noch keine probleme und es wird auch weiterhin keine damit geben.
PunI$0R schrieb:
Wieso? Der Code wird durch solche Dinge nur unuebersichtlich. Zudem ist mir gerade eingefallen was mich noch so daran abgestossen hat. Du ueberlaesst es dem Kompiler ob die Variable nur in der For-Schleife oder auch ausserhalb gueltig ist. Das macht jeder Kompiler anders. Also ist es unschoen und inkompatibel.
dem muss ich widersprechen. der vctoolkit2003-, gcc 3.2 (win), gcc 3.3 (linux) und bcc-compiler verhalten sich hier absolut gleich:
for (int i=0;i<10;i++) std::cout<<i; for (int i=0;i<30;i++) std::cout<<i;
das gibt bei diesen 4 compilern keine fehler!