Hallo und willkommen zurück.
In diesem Vortrag möchte ich über einige häufige Fehler sprechen, die Sie beim Programmieren
in c machen werden.
Einige davon kennen Sie vielleicht aus Ihren vorherigen Herausforderungen,
und Sie sind bereits auf diese Fehler gestoßen, aber dies
sind die häufigsten Arten von Fehlern.
Der erste ist sehr, sehr offensichtlich. Es fehlt ein Semikolon.
Denken Sie daran, dass alle Anweisungen in c mit einem Semikolon enden.
Wenn Sie es dort nicht haben, wird sich der Compiler beschweren.
Es ist also ein sehr häufiger Fehler, ein Semikolon falsch zu platzieren oder
ein Semikolon vollständig zu verpassen. In diesem Fall platzieren wir ein Semikolon falsch.
Wir haben eine if-Anweisung. Wir setzen ein Semikolon am Ende der if-Anweisung.
Und dies führt tatsächlich dazu, dass das Verhalten des Programms völlig anders ist.
Dies wird tatsächlich kompiliert.
Wenn Sie ein Semikolon verpassen und es nicht einmal enthalten haben, wird es nicht kompiliert.
In diesem Fall wird der Wert von j jedoch immer auf Null
gesetzt, da das Semikolon in der if-Anweisung platziert wurde.
Das Semikolon ist also vollkommen gültig, um es nach der if-Anweisung zu haben.
Es repräsentiert tatsächlich die Null-Anweisung.
Und deshalb haben Sie keinen Fehler durch den
Compiler, aber dies wird ein Problem verursachen, da j niemals auf Null gesetzt wird.
Und diese Art von Fehler kann auch beim Schleifen häufig auftreten.
Wenn Sie eine Schleife haben und das Semikolon am
Ende der for-Schleife einfügen, haben Sie möglicherweise eine Klammer, in der Sie die
Klammer nicht haben, da Sie häufig einen Fehler haben, wenn Sie die Klammer haben.
Ein anderer verwechselt den Gleichheitsoperator mit dem Gleichheitsoperator.
Insbesondere wird erwähnt, dass der Operator equals
equals keine Zeichenfolgen vergleicht. Wenn Sie also beim Vergleichen von Zeichenfolgen
gleich gleich verwenden, ist dies nicht gültig. Es wird nur die Referenzen vergleichen.
Wenn Sie jedoch tatsächlich vorhaben, einer Variablen einen Wert zuzuweisen und
stattdessen gleich gleich zu verwenden, benötigen Sie einen Compiler.
Wenn Sie nun versuchen, zwei Elemente zu vergleichen, z.
B. zwei Ganzzahlen innerhalb einer if-Anweisung, und stattdessen den Zuweisungsoperator
verwenden, wird tatsächlich kein Compilerfehler angezeigt,
aber dieser Ausdruck wird immer als wahr ausgewertet.
Wenn Sie also die Gleichheit verwenden und die Gleichheit nicht
verwenden, erfolgt dies normalerweise in der if while do-Anweisung innerhalb des Booleschen Ausdrucks.
Und dies ist gültig, außer dass
es den Effekt hat, etwas zuzuweisen, anstatt etwas auszuführen.
Wenn in diesem
Beispiel also a gleich 2 ist, wird a 2 zugewiesen.
Es wird immer auf true gesetzt, da dies eine wahre Aussage ist, da
Sie bei der Zuweisung niemals versagen. Und so wird printf immer laufen.
Was Sie hier wirklich vorhatten, ist zu sagen, ob a gleich ist.
Daher ist es sehr üblich, die Gleichheit im Gegensatz zur Gleichheit zu
verwenden und dann keinen Compilerfehler zu haben.
Wenn Sie in der falschen Situation gleich
gleich verwenden, kann es
auch zu unerwartetem Verhalten kommen, aber es tritt
ein Compilerfehler auf, wenn Sie es falsch für die Zuweisung verwenden.
Aber seien Sie vorsichtig mit den Gleichen anstelle der Gleichen Gleichen.
Auslassen von Prototypdeklarationen.
Ich erwähnte, dass es wirklich wichtig ist, Ihre Funktionen immer oben
in der Datei zu deklarieren, bevor Sie sie verwenden.
Dies ist jedoch nicht immer der Fall und ein sehr häufiger Fehler.
In der Regel wird im Compiler ein impliziter
Deklarationsfehler angezeigt.
Wenn Sie in diesem Beispiel die Quadratwurzel später im Programm definiert
haben als an der Stelle, an der Sie sie aufrufen, oder in
einer anderen Datei und diese
nicht explizit deklariert haben, werden einige Warnungen angezeigt.
Der Compiler geht davon aus, dass die Funktion ein int zurückgibt.
Es ist immer am sichersten, diese Prototypdeklaration für alle von
Ihnen aufgerufenen Funktionen entweder
explizit oder implizit
oben einzufügen, indem Sie die richtige Header-Datei in Ihr Programm aufnehmen.
Wenn Sie dies jedoch nicht einschließen, können bei diesen Prototypdeklarationen
Fehler auftreten.
Fehler beim Einschließen der Header-Datei, die die Definition für
eine im Programm verwendete c-Programmierbibliotheksfunktion enthält.
In diesem Fall möchten Sie also Code wiederverwenden. Möglicherweise haben Sie die Funktion
printf, mit der Sie eine Ausgabe anzeigen möchten, aber Sie enthalten nicht die Standard-lib-Headerdatei.
Das ist ein Fehler. Und das wird Ihnen normalerweise vom Compiler mitgeteilt.
Es wird ein Verknüpfungsproblem mit
dieser Funktion geben.
In diesem Fall haben wir also eine doppelte Antwort, die dem Quadratwurzelwert 1 entspricht.
Wenn dieses Programm die Mathematik nicht enthält. Header-Datei, dies
erzeugt einen Fehler, dass die Quadratwurzel undefiniert ist.
Es wird versucht, die Objektdateien zu verknüpfen. Es wird keine Mathematik geben. Ö.
Und es wird heißen, hey, Sie nennen die Quadratwurzel, aber es gibt keine Implementierung dafür.
Stellen Sie daher sicher, dass Sie die
richtigen Header für alle Ihre Funktionsaufrufe einschließen, insbesondere aus der Standardbibliothek.
Verwirrung einer Zeichenkonstante in einer Zeichenkette.
Wenn wir also Text haben, der einem einfachen einfachen Anführungszeichen entspricht, ist
dies ein einzelnes Zeichen, das dem Text zugewiesen wird.
Wenn wir eine Variable mit dem Namen text haben und in doppelten
Anführungszeichen zuweisen, ist dies ein Zeiger auf die Zeichenfolge.
Das gilt nicht für ein einzelnes
Zeichen.
Und tatsächlich haben wir über
String-Konstanten gesprochen und sie Zeichen-Arrays zugewiesen.
Und wie kann man das nicht mit Gleichen machen und man muss
sie tatsächlich mit der Sternenkopie machen.
In diesem Fall, wenn wir sagen, dass Text gleich a ist, wird ein Zeiger
zugewiesen, und dies ist auch nicht gültig.
Sehen Sie, was Sie tun müssten, wenn Sie den Sternentext
gleich a oder die Sternkopie tun müssten, wenn Sie nicht Ich möchte es
nicht direkt so zuweisen.
Aber Sie verstehen das Wesentliche.
Verwenden eines Innens aus einfachen Anführungszeichen gegenüber einem Zeichen in
doppelten Anführungszeichen völlig anders, Zeichen gegenüber Zeichenfolge.
Im ersten Fall wird Text normalerweise als Zeichenvariable deklariert.
Und im zweiten Fall sollte es als Typzeiger auf ein Zeichen deklariert werden.
Und wenn Sie diesem Zeiger einen anderen Wert als
den Zeiger selbst zuweisen möchten, müssen Sie ihn de-referenzieren.
Dies ist eigentlich falsch, denn wenn es sich um
einen Zeiger handelt, anstatt eine Adresse zuzuweisen, weisen Sie ihm eine Zeichenfolge zu, sodass
dies keinen Sinn ergibt.
Verwenden Sie die falschen Grenzen für ein Array.
Hier deklarieren wir ein ganzzahliges Array mit einer Größe von 100 und dann
ein paar Variablen I und summieren, wobei nur einige initialisiert werden.
Und wir gehen durch unsere Schleife, wir sagen für I gleich 1 I ist kleiner als gleich 100.
Das ist falsch, weil die Größe von hundert bedeutet, dass das
Array hundert Elemente enthält. Arrays basieren jedoch auf Null.
Das erste Element ist also Null. Der maximale Index, den Sie in
einem Array zuweisen oder auf den Sie zugreifen können, beträgt 99.
Dies wird weniger als gleich sein.
Sie werden hier also einen Fehler außerhalb der Grenzen haben.
Dies ist kein gültiger
Index, da diese Schleife bis 100 reicht.
Es ist wahrscheinlich auch falsch, weil Sie bei 1 beginnen.
Wenn Sie wirklich das erste Element dieses Arrays wollten, würden Sie bei 0 beginnen.
Das Vergessen, einen zusätzlichen Speicherort in einem Array für
das abschließende Nullzeichen einer Zeichenfolge zu reservieren,
ist ebenfalls ein häufiges Problem.
Wenn Sie Ihre Zeichenarrays deklarieren, müssen sie groß genug sein, um das allein endende Zeichen zu enthalten.
Aus diesem Grund würde ich Ihnen empfehlen,
beim Erstellen keine Größe in ein Array einzufügen, wenn Sie es initialisieren.
Sie würden die Größe nur dort eingeben, wenn Sie sie nicht initialisieren.
Wenn Sie die Initialisierung in derselben Zeile erstellen, lassen Sie c die
Arbeit für Sie erledigen. Dadurch wird automatisch die richtige Größe festgelegt und der Nullterminator wird eingefügt.
Wenn Sie beispielsweise eine Zeichenfolge mit dem Namen "Hallo"
haben, sind dies mehr als fünf Speicherplätze. Aufgrund des Nullterminators am Ende sind es sechs.
Vergessen Sie nicht die Größe Ihrer Arrays.
Dies ist ein häufiges Problem bei Zeigern, über die wir nicht viel gesprochen haben, aber
ich wollte nur erwähnen, weil es sehr häufig ist.
Wenn Sie in Zeigern auf etwas zugreifen oder es sogar anweisen möchten,
wenn Sie über einen Zeiger auf
etwas zugreifen möchten, müssen Sie den Bindestrich verwenden, der größer als das Symbol ist.
Dies wird verwendet, wenn Sie auf ein Zeigerelement zugreifen.
Wenn Sie also einen Zeiger haben, der auf eine Struktur zeigt, greifen Sie auf diese Weise darauf zu.
Wenn Sie eine Struktur haben,
die kein Zeiger ist, greifen Sie mit einem Punktoperator darauf zu.
Oft ist dieser Punktoperator und dieser Bindestrich dann größer
als falsch verwendet.
Punkt für Nicht-Zeiger, Zeiger Strich größer als, dies wird in
mehr unserer Beispiele deutlich.
Auslassen des kaufmännischen Und vor Vorzeigervariablen in einem scanf-Aufruf.
Denken Sie also daran, dass unser scanf-Aufruf einen Zeiger als zweites Argument erwartet, und
das bedeutet eine Adresse.
Wenn wir einen Datentyp als Variable vom Typ int deklarieren, ist
das kein Zeiger.
Damit scanf diese Daten in unserer int-Variablen speichern kann, müssen wir das kaufmännische Und übergeben, um zu
sagen, dass es sich um eine Adresse handelt.
Dies ist also falsch, da
das kaufmännische Und vor der Zahl und der Scan f nicht vorhanden sind,
da das zweite Argument nicht gültig ist. Das kaufmännische Und fehlt nur dann, wenn Sie einen Zeiger
wie ein Zeichenarray verwenden.
Alle Argumente, die nach der Formatzeichenfolge und scanf erscheinen, müssen Zeiger sein.
Verwenden einer Zeigervariablen vor der Initialisierung.
Hier ist ein Beispiel, wie Sie einen Zeiger erstellen und dann versuchen, ihn zuzuweisen.
Und dies ist die richtige Zuordnung, bei der Sie einen Wert zuweisen, den Sie nicht mehr referenzieren.
Was wir hier jedoch nicht getan haben, ist, dass wir den Zeiger so initialisiert haben, dass ihm
tatsächlich Speicher zugewiesen wurde, und Sie können
dies in c nicht tun.
Sie können den Indirektionsoperator, bei dem es sich um
das Sternchen vor handelt, nur auf einen Punkt oder
eine Variable anwenden, nachdem Sie die Variable festgelegt haben, die auf eine bestimmte Stelle zeigt.
Es muss also irgendwohin zeigen, im Moment ist es null, es zeigt nirgendwo hin, weil Sie
keinen Speicher zugewiesen haben.
Der Zeichenzeiger ist also niemals so eingestellt, dass er auf etwas zeigt, sodass die Zuweisung nicht aussagekräftig ist.
Dies würde tatsächlich einen Segmentierungsfehler verursachen.
Ein weiterer häufiger Fehler ist das Weglassen der break-Anweisung am Ende eines Falls in einer switch-Anweisung.
Wenn am Ende eines Falls keine Unterbrechung enthalten ist, wird die Ausführung mit dem nächsten Fall fortgesetzt.
Das habe ich also erwähnt, wo Sie einen Fall haben, der ausgewertet wird.
Und wenn Sie diese Unterbrechung dort nicht haben, geht es direkt
zum nächsten Fall und führt den Code in diesem nächsten Fall aus.
Sie möchten also immer Pausen in Ihren Fallaussagen haben.
Es gibt Zeiten, in denen Sie einen Follow-Through-Fall zu einem anderen Fall
haben möchten, und sie tun genau das Gleiche.
In diesem Fall hätten Sie nichts in der case-Anweisung.
Einfügen eines Semikolons am Ende einer Präprozessordefinition.
Präprozessordefinitionen erinnern sich daran, mit der Zahl,
dem Pfundsymbol, zu beginnen. Der Präprozessor wird normalerweise zur Optimierung vor
dem Compiler ausgeführt.
Die korrekte Syntax für Präprozessordefinitionen darf kein Semikolon enthalten.
Gewöhnen Sie sich jedoch an, nach allem immer ein Semikolon zu setzen.
Sie müssen sich jedoch daran erinnern, dass dies falsch ist, wenn Sie konstante
Daten definieren, für die Sie kein Semikolon benötigen.
Dies führt zu einem Syntaxfehler, wenn
ein solcher Ausdruck verwendet wird.
so wie das. Wenn Sie also tatsächlich versuchen, dies
zu verwenden, um herauszufinden, ist es in Ordnung, dieses Semikolon am Ende zu haben.
Wenn der Präprozessor ausgeführt wird, wird genau das eingefügt, was in dem definierten Prozessor enthalten ist.
Es wird also bis zum Ende des 999-Doppelpunkts dienen.
Dies ist, was der Compiler sehen wird und es wird tatsächlich einen Fehler verursachen,
das wäre ein Syntaxfehler.
Das Weglassen einer schließenden Klammer oder das Schließen von Anführungszeichen in
einer Anweisung ist sehr häufig. Dies hängt also auch direkt mit
Klammern zusammen, die eine beginnende geschweifte Klammer haben und dann die geschweifte Klammer nicht
beenden, genau wie Klammern. In diesem Fall
haben wir zwei beginnende linke Klammern oder drei, aber wir
haben nur zwei endende Klammern. Wir vermissen eine rechte Klammer.
Das wäre ein Syntaxfehler, den der Compiler finden würde.
Wenn Sie also die Einbettung in Klammern verwenden, um jeden Teil einer Gleichung voneinander zu
trennen, wird die Codezeile besser lesbar.
Sie möchten Klammern verwenden.
Sie möchten jedoch sicherstellen, dass alle übereinstimmen,
wenn Sie eine Klammer beginnen. Sie müssen eine abschließende schließende Klammer haben, genau wie bei geschweiften Klammern.
Wenn Sie eine geschweifte Klammer beginnen, muss sie eine abschließende geschweifte Klammer haben.
Entweder haben Sie zu viele oder Sie haben zu
wenig, aber der Compiler wird sich beschweren, und das ist sehr, sehr häufig.
In der zweiten Zeile fehlt also auch ein schließendes Anführungszeichen, diese Druckanweisung.
Wir haben kein Abschlusszitat.
Der Compiler wird sich darüber beschweren.
Beides führt zu einem Kompilierungsfehler.
Manchmal ist der Compiler jedoch sehr irreführend, da er
nicht weiß, wo der Fehler auftritt. Es wird vermutet, dass der Fehler in einer nachfolgenden Zeile aufgetreten ist.
Die Zeile, in der der Fehler angezeigt wird, ist möglicherweise irreführend.
Je nachdem, ob der Compiler
in einer nachfolgenden Zeile eine Klammer oder ein
Anführungszeichen verwendet, wird dieser Ausdruck tatsächlich vervollständigt.
Der Fehler wird also in eine andere Zeile verschoben.
Und genau das wird sich beschweren und sagen, dass dort der Fehler liegt. Der tatsächliche Fehler liegt
jedoch höher über der Stelle, an der Sie ihn platzieren wollten.
Dies sind einige häufige Fehler, die viele C-Programmierer
machen.
Sie sind leicht zu reparieren. Und wenn Sie sie verstehen und
studieren, wissen Sie,
dass Sie sie nicht machen sollen. Es ist in Ordnung,
sie als Anfänger zu machen, aber wenn Sie mehr und
mehr programmieren und mehr üben, werden Sie feststellen, hey, ich habe
eine Klammer vergessen, ich habe eine Klammer vergessen, ich habe die Gleichheit und die Gleichheit
nicht richtig verwendet Ich verwende Zeiger falsch, ich habe keinen Speicher zugewiesen.
All diese Dinge werden mehr zur zweiten Natur werden. Vielen Dank.