globale und lokale Variablen



  • 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


  • Mod

    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!


  • Mod

    Lars Hupel schrieb:

    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!

    du musst vc aber explizit sagen (/Zc:forScope), dass er das hier NICHT akzeptieren soll:

    for (int i=0,s=0;i<10&&s<10;i++) s+=i;
    if ( i < 10 ) // ...
    


  • so was habe ich noch nicht probiert...


Anmelden zum Antworten