gängige Anfänger-Fehler?



  • Ein klassischer Anfängerfehler ist auch breaks nach cases zu vergessen obwohl man sie eigentlich benötigen würde. (Der Compiler sagt dazu leider klarerweise nichts... 🙂 )
    Oder bei STL-Funktionen die Präfixe entgegennehmen diese als myPrefix() statt als myPrefix zu übergeben...



  • if (x = y)
    

    statt

    if (x == y)
    


  • Ringincludes sind auch fies.

    a.h in b.h includen und b.h in a.h includen. Passiert zwar nicht nur Anfängern, aber die wissen am wenigsten, was ihnen da passiert sein könnte.



  • for(int i=0; i<10; ++i);
    

    Arrayindex mit 1 beginnen statt mit 0 (hinten Speicherüberschreitung)



  • Also Variablen innerhalb eines Case-Zweiges geht doch

    Für das if (x = 9)-Problem würd ich einfach als Tipp schreiben,dass man sich
    angewöhnen soll if (9 == x) zu schreiben



  • Hi,

    virtuell Realisticer schrieb:

    Hi,

    was mir schon ein paar mal passiert ist:

    if(....);
       wird_ja_nie_aufgrund_der_bedingung_ausgefuehrt();
    

    Weiss jetzt allerdings nicht, ob der Compiler ne Meldung wirft.

    gute Compiler tun das:

    warning C4390: ';': Leere kontrollierte Anweisung aufgetreten; ist dies beabsichtigt?

    Manchmal macht man das ja aber auch absichtlich, v.a. bei while()-Schleifen.

    ChrisM



  • Hi,

    mir fällt da gerade etwas ein, was zwar keinen fehler generiert, aber Anfängern mal passieren kann:

    for(int i = 1;i < 10; i++);
     { //...
     }
    


  • c++eus schrieb:

    Hi,

    mir fällt da gerade etwas ein, was zwar keinen fehler generiert, aber Anfängern mal passieren kann:

    for(int i;i < 10; i++);
     { //...
     }
    

    Aber hallo, i ist nicht initialisiert.



  • Daniel E. schrieb:

    c++eus schrieb:

    Hi,

    mir fällt da gerade etwas ein, was zwar keinen fehler generiert, aber Anfängern mal passieren kann:

    for(int i;i < 10; i++);
     { //...
     }
    

    Aber hallo, i ist nicht initialisiert.

    Doch mit 0



  • Daniel E. schrieb:

    c++eus schrieb:

    Hi,

    mir fällt da gerade etwas ein, was zwar keinen fehler generiert, aber Anfängern mal passieren kann:

    for(int i;i < 10; i++);
     { //...
     }
    

    Aber hallo, i ist nicht initialisiert.

    Habs schon verbessert. Wobei: das kann man ja eigentlich auch aufführen. Gibt zwar ebenfals keinen Fehler, kommt aber zu unvorhersehbaren Fehlern.



  • SirLant schrieb:

    Doch mit 0

    Nur wenn die Schleife global wäre. Dann wiederum erzeugt sie einen Syntaxfehler.

    c++eus: Genau das meinte ich. Viele Compiler warnen allerdings irgendwie.



  • SirLant schrieb:

    Daniel E. schrieb:

    c++eus schrieb:

    Hi,

    mir fällt da gerade etwas ein, was zwar keinen fehler generiert, aber Anfängern mal passieren kann:

    for(int i;i < 10; i++);
     { //...
     }
    

    Aber hallo, i ist nicht initialisiert.

    Doch mit 0

    Mit 0? Wird es nicht mit dem schon im Speicher befindlichen Wert belegt?
    Bei mir kommt folgendes raus:

    1073823776
    


  • Daniel E. schrieb:

    c++eus: Genau das meinte ich.

    War aber eigentlich nicht als Fehler gedacht... 😞



  • Also nur bei globalen Variablen?
    Mein VC++ warnte nicht als ich folgendes testete in main:
    for (int i; i < 10; i++);



  • SirLant schrieb:

    Mein VC++ warnte nicht als ich folgendes testete in main:
    for (int i; i < 10; i++);

    Stell mal die Warnungsstufe hoch, dann muß er schon warnen.



  • SirLant schrieb:

    Also nur bei globalen Variablen?
    Mein VC++ warnte nicht als ich folgendes testete in main:
    for (int i; i < 10; i++);

    Lass dir doch mal i ausgeben. Dann erhälst du Zahlen wie 10543.

    musicman schrieb:

    Stell mal die Warnungsstufe hoch, dann muß er schon warnen.

    Aber dabei handelt es sich doch um gültiges Standard-C++, oder? Da dürfte er doch keine Warnung ausgeben.



  • C++Eus schrieb:

    Aber dabei handelt es sich doch um gültiges Standard-C++, oder? Da dürfte er doch keine Warnung ausgeben.

    int i =1;
    //...
    if(i = 5)
    

    Das ist auch Standard-C++, trotzdem ist der Compiler so nett und weist darauf hin, dass es vielleicht nicht so gewollt ist!

    [edit]hab die Quote-Tags korrigiert[/edit]



  • Bleibt c++eus noch zu sagen, dass ich schon vor ihm auf den Semikolon-hinter-for-Schleife-Fehler gekommen bin.



  • 1. warnen darf ein Compiler so viel er will
    2. und der Zugriff auf nicht initialisierten Variablen ist `undefined behaviour` also nicht Standardkonform



  • c++eus schrieb:

    Aber dabei handelt es sich doch um gültiges Standard-C++, oder? Da dürfte er doch keine Warnung ausgeben.

    Warnen darf er doch soviel und so wenig wie er will. zB ist
    if(i=0)
    in den meisten Fällen nicht gewollt. Deshalb fragt mich mein Compiler immer ganz nett: 'Ausdruck ergibt immer 'false'. Hast du wirklich = gemeint und nicht ==?'

    Solche Warnungen sind nicht nur völlig OK, sondern verdammt nützlich.
    zB auch:
    while(1);
    {
    }

    da fragt er mich dann 'Ist dieses leere Statement beabsichtigt?'

    Einen Fehler darf er mir aber nicht anzeigen - aber warnen soviel er will.


Anmelden zum Antworten