Hallo und willkommen zurück.
In diesem Vortrag möchte ich sprechen über das Definieren von Funktionen in c.
Funktion definieren.
Wir kennen die Bedeutung von Funktionen.
Wir verstehen die Vorteile.
Wir werden verwenden wollen Funktionen in unseren Programmen.
Also, wenn Sie eine Pro-Funktion erstellen In c müssen Sie den
Funktionsheader als erste Zeile angeben der Definition der Funktion.
Wir werden über das Definieren sprechen eine Funktion, und wir werden
auch über die Implementierung einer Funktion sprechen.
Eine Funktion implementieren ist nur Problemlösung, es
ist nur normaler C-Code.
Das Definieren einer Funktion heißt dass die Funktion existiert.
Wenn Sie also eine Funktion definieren, wird die Als erstes
haben Sie diesen Funktionsheader und folgen dann das mit einer geschweiften Klammer, die den Blockcode
für die Funktion startet.
Es ist also genau so, als ob Sie a verwenden
geschweifte Klammer in einer if-Anweisung, genau wie wenn Sie eine geschweifte Klammer verwenden in einer for-Schleife, außer dass die
geschweifte Klammer für Funktionen erforderlich ist.
Es gibt keine Möglichkeit, es zu beseitigen.
Und es bedeutet immer den Start des Codes für diese Funktion.
Alles zwischen dem Start und das Ende der geschweiften Klammer ist der
Code für die Funktion.
Es ist, wohin du gehst die Aufgabe zu implementieren.
Also zwischen den Klammern ist genannt der Funktionskörper und die erste Zeile
der Funktion wird als Funktionsheader bezeichnet.
Der Funktionsheader definiert der Name der Funktion, die
Parameter der Funktion.
Wir werden darüber reden Parameter und Argumente im Detail.
Aber gerade jetzt, du gerade müssen wissen, dass es
so etwas wie Parameter gibt.
Und der Parameter wird spezifizieren die Anzahl und die Arten der Werte,
wie Sie Daten und Parameter übergeben können haben mit der Weitergabe von Daten zu tun.
Der Typ für den Wert dass die Funktion zurückgibt.
Wir haben erwähnt, dass Funktionen Wir können Daten zurückgeben.
Also in diesem Funktionsheader, Sie werden den Namen
der Funktion haben, die Daten, die Sie können nehmen, kann von der Funktion und den
Daten akzeptiert werden das wird von der Funktion zurückgegeben.
Wir werden uns jetzt nicht konzentrieren Über die Daten, die übergeben oder zurückgegeben werden können,
gehen wir einfach weiter Sprechen Sie über das Erstellen einer einfachen Funktion.
Der Funktionskörper enthält Nur normaler Code, und dieser Code wird ausgeführt, wenn Sie Rufen
Sie die Funktion auf oder rufen Sie sie auf.
Und der Funktionskörper selbst hat Zugriff auf alle Werte, die als
Argumente übergeben werden.
Also die Daten, an die Sie übergeben Sie können
diese Daten im Funktionskörper verwenden.
Wie es aussieht ist Dies ist der Funktionsheader.
Funktionsheader hat das erste Wort.
Und Funktionsheader ist a Schlüsselwort, das den Datentyp darstellt, der sein
wird von der Funktion zurückgegeben.
Das nächste Schlüsselwort gibt es der Name der Funktion.
Und dann haben Sie eine linke Klammer und dann haben Sie Parameter durch Kommas getrennt,
das sind die Daten das ist an die Funktion übergeben.
Und dann hast du das rechte Klammern,
um den Funktionsheader zu beenden.
Dann haben Sie die geschweifte Klammer das bedeutet den
Start der Funktionsimplementierung.
Und Sie haben eine beliebige Anzahl von Anweisungen, um eine Aufgabe zu erledigen.
Wie ich schon sagte, du willst Lassen Sie Ihre Funktionen klein sein.
Sie wollen zusammenhängend sein.
Sie wollen nicht sein überall.
Sie wollen eine Single haben Fokus, etwas Bestimmtes tun.
Wie ich schon sagte, wenn Sie eine Funktion haben das bekommt Eingabe, es liest Eingabe.
Die Ausgabe wird nicht ausgedruckt.
Es wird nicht sortiert oder macht sonst nichts.
Wenn Sie eine Funktion namens haben sortieren, sortiert es die Daten.
Es wird keine Eingabe erhalten.
Funktionen müssen sein zusammenhängend und klein.
Es ist viel einfacher, diese zu debuggen Funktionen, also machen Sie sie zusammenhängend.
Und dann hast du das Recht geschweifte Klammer,
die die Funktionsimplementierung beendet.
Das ist was für eine Funktion sieht aus wie in c.
Konzentrieren wir uns nun auf die Funktion Namen, und wir werden später
über die Parameter und Rückgabetypen sprechen.
Die erste Zeile der Funktion erneut Die Definition teilt dem Compiler drei Dinge in der
Reihenfolge von links nach rechts mit über die Funktion, wie ich schon sagte.
Der Typ des Wertes gibt zurück, den Namen der Funktion und dann
alle Daten, die sie benötigt.
Dies ist nur um zusammenzufassen, das ist wichtig.
Was die Funktionsnamen betrifft, möchten Sie sinnvolle Funktionsnamen auswählen.
Es ist genauso wichtig wie die Auswahl aussagekräftige Variablennamen.
Es wirkt sich stark auf die Die Lesbarkeit des Programms, benennen
Sie also nicht die Funktionen x oder y.
Benennen Sie die Funktion basierend auf was es tun wird.
Wenn es zwei hinzufügt Zahlen, nennen Sie es hinzufügen.
Wenn es zwei subtrahiert Zahlen, nennen Sie es subtrahieren.
In diesem Beispiel ist hier unsere einfache Funktion.
Mach dir keine Sorgen über die Leere, Sorgen Sie sich nur um den Namen hier.
Wir haben eine Funktion benannte Drucknachricht.
Und dann sehen wir diese geschweifte Klammer was
bedeutet, dass die Funktion gestartet wird, und dann Wir haben einige Implementierung.
Und diese Implementierung tut nichts weiter als
das Anzeigen einer Zeichenfolge, eines Textes.
Und dann haben wir das rechte geschweifte Klammer.
Das ist also eine sehr einfache Funktion macht nicht viel, es zeigt die Ausgabe an.
In diesem Beispiel für den Druck Nachricht, die erste
Zeile der Drucknachricht teilt dem Compiler mit dass die Funktion keinen Wert zurückgibt.
Das ist das Schlüsselwort void.
Auch hier müssen Sie sich nicht konzentrieren das, aber das ist es, was das tut.
Der nächste ist der Name.
Und dann nach dem Namen ist Argumente werden sie Parameter genannt.
Und wir verwenden wieder das Schlüsselwort void wenn wir keine Daten übergeben.
Die Anweisung in der Funktion Körper kann fehlen, aber die Zahnspangen
müssen immer vorhanden sein.
Sie müssen also keine haben Implementierung, aber Sie müssen die geschweiften Klammern haben,
damit eine Funktion vorhanden ist.
Wenn es keine Aussagen in gibt Im Hauptteil einer Funktion muss
der Rückgabetyp ungültig sein.
Und noch einmal, wir werden uns später darauf konzentrieren und die Funktion wird nichts tun,
weil Sie keine Implementierung haben.
Wenn Sie eine Funktion mit definieren ein leerer Körper, es kann immer noch
nützlich sein, obwohl es ist nichts erreichen.
Das machst du normalerweise während der Testphase eines sehr großen Programms.
Und was Sie damit tun können ist, dass Sie das Programm tatsächlich
nur mit bestimmten Funktionen ausführen können Wenn Sie etwas tun, können
Sie besser testen und Fehler isolieren.
Sie könnten sogar eine Implementierung haben im Test
im Funktionskörper aber einfach auskommentieren.
Und dann können Sie dies tun Ansatz teilen und erobern.
Da testest du immer mehr und Darüber hinaus können Sie die Implementierung
in die Funktionskörper einfügen.
Es ist eine Schritt-für-Schritt-Anleitung Arbeitsprozess.
Sie arbeiten ständig in kleinen Chunks, Code hinzufügen, diesen Code testen und dann zum nächsten übergehen
Schritt und dann wird schließlich die gesamte Implementierung
abgeschlossen und Alle Funktionen werden implementiert.
Es gibt also einen Anwendungsfall für einen Funktionskörper haben, der
keinen Code hat oder auskommentiert ist.
Benennungsfunktionen.
Der Name einer Funktion kann ein beliebiger gesetzlicher Name sein.
Genau wie wenn du bist Wenn Sie eine Variable benennen,
können Sie keine reservierten Wörter verwenden.
Das sind also Schlüsselwörter in der Sprache wie Enter Doubles,
da sie Datentypen darstellen.
Sizeof ist ein Operator.
Du willst in der Lage sein um es für oder wenn zu verwenden.
Sie könnten auch nicht zwei haben funktioniert mit dem gleichen Namen.
Und darauf wird auch verwiesen als Funktionsüberladung, Art.
Sie können jedoch nicht zwei Funktionen haben Mit demselben Namen wird eine Überladung in
c nicht unterstützt.
Schließlich können Sie das gleiche haben Name als Funktion, die in
der Standardbibliotheksfunktion enthalten ist.
Technisch, wenn Sie nicht einschließen Diese Bibliothek enthält eine Header-Datei. Möglicherweise können
Sie sie haben.
Aber wenn Sie jemals tatsächlich verwenden wollten Diese Bibliotheksfunktion würde der
Compiler beschweren und sagen, dass Sie haben zwei gleichnamige Funktionen.
Nennen Sie Ihre Funktionen also nicht die wie Standardbibliotheksfunktionen.
Ein legaler Name ist der gleiche wie eine Variable, eine Folge von
Buchstaben und Ziffern, um zu beginnen.
Das erste Zeichen muss ein Buchstabe sein und der Buchstabe kann ein Unterstrich sein.
Sie können keine Funktionen starten mit Zahlen oder irgendwelchen
seltsamen Zeichen.
Der Name, den Sie wählen, sollte sinnvoll und relevant für das sein,
was die Funktion tut.
Ich habe das schon gesagt, ich wiederhole es Zur Hervorhebung sind aussagekräftige
Namen sehr wichtig.
Sie werden oft die Funktion definieren Namen und Variablennamen, die aus
mehr als einem Wort bestehen.
Jetzt möchte ich ein wenig reden ein bisschen über nur Codierungsstil.
Sie haben es wahrscheinlich bemerkt, als ich schrieb meinen Code, dass ich Kamel Fall verwenden.
Es gibt drei verschiedene Möglichkeiten Sie können die Namen Ihrer
Variablen und Funktionen schreiben.
Sie können jedes der Wörter trennen In einem Funktionsnamen mit
einem unterstrichenen Zeichen ist dies ein Ansatz.
Sie können den ersten Buchstaben groß schreiben von jedem Wort oder
Sie können Wörter nach dem ersten Wort groß schreiben, und Sie haben immer noch zusammen klimpern.
Denken Sie daran, Sie können nicht Zwischenräume haben.
Dies ist nur ein Ansatz für Benennen, weil
es wichtig ist, dass Sie eine Konvention befolgen damit es leichter zu lesen ist.
Ich habe nur ein langes Wort mit fünf verschiedenen Wörtern.
Wenn Sie also eine Funktion hatten, die besagt Suchen Sie nach gültigen Eingaben. Sie möchten
nicht, dass alle Kleinbuchstaben eingegeben werden.
Es wäre wirklich schwer zu lesen und identifizieren, wo die Wörter waren.
Kamel Fall ist also ein Weg zu Identifizieren Sie in vielen Wörtern, wo sich die
Wörter befinden, und es ist leicht zu erkennen was diese Funktion tut.
Ein Unterstrich ist ein anderer Weg, um Wörter zu trennen.
Und den ersten Buchstaben von groß schreiben Jedes Wort ist eine andere Art zu trennen.
Es ist wichtig, in der Lage zu sein Trennen Sie die Wörter in einer Funktion, um
sie besser lesbar zu machen.
Ich benutze normalerweise Kamelkoffer.
Und wenn Sie eine davon verwenden Konventionen, Sie möchten es für
alles verwenden, Sie möchten verwenden Wenn Sie Variablen benennen möchten, möchten Sie
sie für Ihre Funktionsnamen verwenden.
Normalerweise folgen Sie einfach diesem Durch die gängige Codierungskonvention werden die
Dinge besser lesbar.
Funktionsprototypen.
Wir haben über die Definition einer Funktion gesprochen.
Was ist mit der Deklaration einer Funktion?
Sie können sagen, warum Sie müssen Deklarieren Sie eine Funktion, deklarieren Sie sie
nicht, wenn Sie sie definieren.
Es gibt aber auch ein Konzept eine Funktion zu deklarieren.
Und es ist notwendig, wenn Sie wollen um die Funktion zu verwenden, bevor sie implementiert
wird, bevor sie definiert wird.
Ein Funktionsprototyp ist also ein Anweisung, die eine Funktion definiert.
Es teilt dem Compiler im Wesentlichen mit alle Details der Funktion.
Es definiert seinen Namen, Rückgabetyp und die Art jedes seiner Parameter.
Es sieht also aus wie ein Funktionsheader.
Es bietet alle externen Spezifikationen der Funktion,
hauptsächlich haben Sie wahrscheinlich auch gehört der Begriff Signatur, Funktionssignatur ist
das, was es ist.
Es gibt die zurückgegebenen Daten an. die Daten, die es
nimmt und alles über die Funktion selbst.
Sie möchten einen Funktionsprototyp schreiben So wie Sie den Funktionsheader schreiben, besteht der
einzige Unterschied darin, dass Sie setzen ein Semikolon am Ende.
Und das ist gerecht Deklarieren der Funktion.
Dies bedeutet, dass die Funktion existiert.
Ein Funktionsprototyp ermöglicht der Compiler, um jeweils die entsprechenden Anweisungen
zu generieren Punkt, an dem Sie die Funktion aufrufen.
Es wird auch überprüft, ob Sie das verwenden Funktionieren Sie bei jedem Aufruf korrekt.
Der Grund, warum Sie Funktion bereitstellen Header ist so, dass Sie die Funktion ohne Warnung
oder a aufrufen können Funktionsdeklaration, ohne dass sie implementiert wird, also ist es wirklich gerecht die Reihenfolge
Ihres Codes und ich werde Ihnen gleich ein
Beispiel dafür geben.
Wenn Sie einen Standardheader einfügen Datei in einem Programm
fügt die Header-Datei den Funktionsprototyp hinzu.
Funktionsprototypen gehen in der Regel in Header-Dateien, wenn Sie sie in vielen verschiedenen
Quelldateien wiederverwenden möchten.
Wenn Sie sie nur in einem einzigen verwenden Quelldatei, Sie können sie
einfach oben in der Quelldatei platzieren.
Aber weil wir den printf verwenden Funktion, die in vielen verschiedenen
Quelldateien verwendet werden kann, dieser Header Die Funktion wird im Header oder
in dieser Funktionsdeklaration definiert wird in der Kopfzeile definiert.
Und in diesem Fall stdio. h.
So erscheinen sie normalerweise in Quelldateien, wenn nur diese Quelldatei
diese Funktion verwendet.
Andernfalls setzen Sie sie in eine Header-Datei, wenn
sie von vielen Quelldateien wiederverwendet werden.
Es erlaubt jede der Funktionen in der Datei, um eine der Funktionen aufzurufen,
die unabhängig davon definiert sind, wo Sie haben die Implementierung platziert.
Wenn Sie die Implementierung platzieren von einer Funktion, nachdem Sie sie aufgerufen haben, wird sich
c beschweren und sagen dass es nichts davon weiß.
Denn wenn Sie kompilieren, Sie kompilieren Zeile für Zeile.
Wenn Sie die Erklärung bei platzieren oben, dann können Sie die Funktion
aufrufen, bevor sie definiert ist, bevor es implementiert wird.
Parameternamen müssen nicht die sein Gleiches gilt für die Funktionsdefinition.
Sie können verschiedene Namen haben.
Wenn ich Namen sage, sind das die Kennungen der Daten.
Sie können den Namen des ändern Parameter im Funktionsprototyp.
Sie müssen immer noch die gleichen Daten haben Typen, aber Sie können die Namen ändern.
Es ist immer eine gute Übung Fügen Sie Funktionsdeklarationen
für alle Funktionen in Ihre ein Programm am Anfang der Datei.
Es hält Ihr Programm konsistenter zum Design und es verhindert, dass Fehler
in jedem Stadium auftreten Wenn Sie diese Funktion jemals aufrufen möchten,
bevor Sie sie implementieren.
Hier ist ein Beispiel für Einige Funktionsprototypen.
Ganz oben auf der Datei haben wir unsere Includes.
Und dann haben wir welche Funktionen, die wir deklariert haben,
mitteln, summieren und Daten abrufen.
Sie bemerken, dass es nur so aussieht wie ein Funktionsheader.
Es hat den Rückgabetyp, hat die Parameter, die in
der Funktion definiert sind, aber Am Ende steht ein Semikolon.
Es gibt keine Implementierung für diese Funktionen.
Sie sagen es nur dem Compiler Dies ist die Funktion, die existiert
und so ist sie definiert.
Dies ermöglicht Ihnen jetzt In Ihrer Hauptfunktion können Sie den Durchschnitt aufrufen,
den Sie aufrufen können Die Summe könnte man anrufen, um Daten zu erhalten.
Und die eigentlichen Implementierungen können Sei unten, wo du sie anrufst.
Wenn Sie die Funktion nicht hatten Überschriften hier, als
Sie versuchten, sie in der Hauptsache aufzurufen, wenn sie es waren Unterhalb der Hauptroutine definiert, würden
Sie Fehler oder Warnungen haben.
Schauen wir uns das an dazu in Codeblöcken.
Hier haben wir unsere übliche Hauptroutine.
Sagen wir jetzt, wir wollen um eine Funktion zu erstellen oder wir möchten eine Funktion
aufrufen.
Wir werden a aufrufen Funktion namens add und es werden
keine Parameter akzeptiert.
Wir nennen es in unserem Hauptfunktion in Zeile 7.
Wir werden Implementieren Sie es in Zeile 10.
Wir werden void add und sagen Wir werden nicht einmal etwas tun.
Wir werden es einfach leer halten.
Wenn wir dies kompilieren, was? Sie werden feststellen, dass dieser Compiler nur
eine Warnung ausgibt.
Es heißt hinzufügen hat eine Implizite Erklärung.
Sie können diese Warnung loswerden durch Verwendung einer Funktionsdeklaration.
Sie können die Funktion deklarieren oben oben, um dem Compiler zu sagen, dass Sie gehen werden Verwenden
Sie es irgendwo, aber Sie wissen nicht, wo
sich die Implementierung befindet.
Was Sie also tun können, ist, dass Sie es können Sagen Sie void addiere hier oben
und füge einfach das Semikolon hinzu.
Jetzt wird es das los Warnung und einige Kompilierungen geben Ihnen
tatsächlich einen Fehler.
Wenn ich es jetzt kompiliere, habe ich Keine Warnungen und keine Fehler.
Das ist also was für eine Funktion Erklärung tut.
Es ermöglicht Ihnen zu setzen die Funktion überall.
Nun, wenn Sie die Funktion nicht hatten Erklärung an der Spitze und Sie hatten die
Implementierung oben, wo Sie haben Sie es aufgerufen, dann sehen Sie den Fehler auch
nicht, weil der Compiler wird über die Funktion Bescheid wissen, bevor
sie tatsächlich versucht, sie aufzurufen.
Wenn wir das bauen, sind Sie es auch Ich werde sehen, dass es keinen Fehler gibt.
Jetzt habe ich das normalerweise erwähnt Ich möchte alle Ihre Funktionen
oben nur für eine gute Übung deklarieren und ich denke, das müssen Sie tun.
Also mach das weiter.
Aber wenn Sie da rauskommen Gewohnheit, müssen Sie entweder Ihre Funktionen
deklarieren, bevor Sie sie aufrufen oder Sie müssen
Funktionsprototypen bereitstellen, weil Sie nicht möchten Warnungen oder Fehler in Ihrem Programm.
So können Sie a definieren Funktion, und so können
Sie Funktionsprototypen verwenden.
In der nächsten Vorlesung werden
wir über Parameter sprechen.
Wie Sie Daten an eine Funktion übergeben können.
Vielen Dank.