gängige Anfänger-Fehler?
-
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.
-
KPC schrieb:
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!
Damit hast du natürlich Recht. Aber ich denke, wenn er bei einer Schleife eine Warnung ausgiebt, müsste dann nicht auch bei einer "normalen", lokalen (nicht initialisierten) Variable eine Warnung asusgeben?
[edit]Quote-Tags korrigiert[/edit][edit="zeus"]Danke.[/edit]
-
immer, aber wirklich immer wieder gern gesehen:
class foo { private: TIrgendwas* Irgendwas; public: void Init() { if(Irgendwas) { // nun geht das Geheule los, warum Irgendwas immer true ist oder immer ungleich NULL } } };
-
AndreasW schrieb:
immer, aber wirklich immer wieder gern gesehen:
class foo { private: TIrgendwas* Irgendwas; public: void Init() { if(Irgendwas) { // nun geht das Geheule los, warum Irgendwas immer true ist oder immer ungleich NULL } } };
Das ganze kann man umgehen, wenn man im Konstruktor Irgendwas mit NULL initialisiert.
Aber du spielst wohl eher die Sache mit dem Dereferenzierungsoperator an.