Lektion Nr. 06 Einführung in das Schreiben von Funktionen in C

Lektion Nr. 06 Einführung in das Schreiben von Funktionen in C

Funktion in der C-Programmierung
LektionNr. 06:Einführung in das Schreiben von Funktionen in C Nun zu dem Teil, auf den wir alle gewartet haben, die Grundlage dafür, alles in C zu tun, Funktionen. Wir haben kurz darüber gesprochen, was Funktionen sind, wie sie verwendet werden, wie wir sogar einige Funktionsaufrufe durchgeführt haben usw. Jetzt ist es soweit um wirklich einzutauchen und ein konkretes Verständnis der Funktionen zu bekommen und wie man eigene schreibt. Faire Warnung, einiges davon wird sich wiederholen, also bin ich so nackt, dass ich absolut sicherstellen möchte, dass alles abgedeckt wird.

Funktionen IN der C-Programmierung

Was ist eine Funktion?

Einfach ausgedrückt ist eine Funktion ein Stück Code, das andere kleinere Codebits zusammengeballt hat, um eine bestimmte Aufgabe oder einen Satz von Aufgaben auszuführen. Auch hier sind Dinge wie printf, getchar und main selbst Funktionen, Sie haben also gesehen, was sie können. Lassen Sie uns nun über den Zweck von Funktionen sprechen. Stellen Sie sich vor, wir hätten ein Programm, das einem Benutzer sehr regelmäßig eine Frage stellt und von ihm Input erhält. Es wäre für uns sehr ineffizient, diesen Code jedes Mal neu zu schreiben, wenn wir sie auffordern möchten, also könnten wir stattdessen eine Funktion namens "PromptUser" schreiben, die es uns ermöglichen würde, einfach "PromptUser()" einzugeben, anstatt die Ausgabe neu zu schreiben und geben Sie jedes Mal den Code ein. Das macht Funktionen insofern wertvoll, als sie viel Zeit sparen und Code wiederverwendbar machen.

Die Anatomie einer Funktion

Bevor wir uns mit dem Schreiben von Funktionen befassen, müssen wir verstehen, wie sie auf Kernebene funktionieren. Alle Funktionen haben das gleiche Layout, sie haben einen Rückgabetyp, einen Namen und eine Argumentliste. Ich möchte, dass Sie wirklich aufpassen, denn wir werden in diesem Abschnitt mehrere neue Begriffe einführen. Funktionen haben, zusammen mit Rückgabewert, Name und Argumentliste, zwei verschiedene Aspekte, wenn Sie so wollen. Aspekt eins ist die Funktionsdeklaration, Aspekt zwei ist die Funktionsdefinition. Dies kann sehr verwirrend sein und wird Sie sicherlich stolpern lassen, wenn Sie zum ersten Mal mit dem Schreiben von C-Code beginnen. Achten Sie also sehr genau darauf und lesen Sie diesen Teil regelmäßig erneut, bis Sie ihn verstanden haben. Das ist etwas ziemlich Einzigartiges in C/C++ (obwohl ich sicher bin, dass einige andere Sprachen dies tun), also lassen Sie uns, bevor ich die einzelnen behandle, ein wenig über den Compiler sprechen, der uns den Grund dafür liefert, warum es Funktionsdeklarationen gibt undDefinitionen.

In Ordnung, wenn Ihr Programm also kompiliert wird, geht der Compiler Ihren Code durch und validiert unter anderem, dass alles syntaktisch korrekt ist, indem er Ihren Code von Anfang bis Ende liest die Unterseite. Dies bedeutet, wenn Sie ein Semikolon verpasst haben, wenn Sie eine schließende geschweifte Klammer bei einer Funktion verpasst haben usw. Der Compiler wird Sie darüber informieren. Jetzt müssen alle Funktionen ausgeschrieben werden, um zu zeigen, wie sie funktionieren, und der Compiler muss irgendwie in der Lage sein, diese ausgeschriebenen Versionen der Funktion zu finden. Angenommen, Sie schreiben eine Funktion und rufen sie innerhalb der Hauptfunktion auf. Wenn der Compiler Ihr Programm von oben nach unten liest und zu Ihrer Funktion gelangt, wird er sich Ihren Funktionsaufruf ansehen, sagen Sie sich selbst "Huh, naja... Ich habe diese Funktionen nirgendwo in ausgeschriebener Form gesehen, ich schätze, sie haben sich nie die Mühe gemacht, das zu tun, ich werde es ihnen sagen." Diese "ausgeschriebene" Version Ihrer Funktion wird als Funktionsdefinition bezeichnet. Wenn der Compiler die Funktionsdefinition nicht sieht, bevor er auf den Funktionsaufruf trifft, gibt er einen Fehler aus. Hier kommen Funktionsdeklarationen ins Spiel. Immer wenn Sie eine Funktionsdeklaration schreiben, sagen Sie dem Compiler:„Hey, ich habe eine Funktion, diese isits Name, Rückgabetyp und die Argumente, die es braucht. Ich werde es später im Programm aufrufen, aber Sie werden die Definition der Funktion erst später sehen, also geben Sie mir keinen Fehler, Suchen Sie nach der Funktionsdefinition." Das ist einzigartig in C, weil der Compiler in anderen Sprachen das für Sie herausfindet, und in gewisser Weise ist das nett und es ist nicht so, als wäre es wirklich ineffizienter, als es nicht zu tun, aber in gewisser Weise ist es viel sauberer, Funktionsdeklarationen zu haben so Sie können Ihren Code besser organisieren (meine persönliche Meinung). Nebenbei bemerkt, Sie werden oft den Begriff "Funktionsprototyp" hören, dieser Begriff ist austauschbar mit Funktionsdeklaration, ehrlich gesagt bevorzuge ich Funktionsprototyp, aber ich entscheide mich vorerst für die Verwendung der Deklaration für diese Lektionen. Ich kann beides verwenden, seien Sie also vorbereitet.

Also mit all dem jetzt in unseren Köpfen können wir uns die Funktionen richtig ansehen. Zu Beginn lernen wir also die Funktionsdeklaration kennen. Wenn wir unsere Afunction-Deklaration schreiben, sieht sie so aus:


„Rückgabetyp“ „Funktionsname“ („Argumente“);
Das war es wirklich, nun zu den Funktionsdefinitionen. Funktionsdefinitionen sind fast genau gleich, außer dass Sie den Code hinzufügen, den die Funktion ausführen soll. Beispiel:


„Rückgabetyp“ „Funktionsname“ („Argumente“) { "Code, den die Funktion ausführt";
Zwei Dinge sollten Sie beachten. Erstens gibt es geschweifte Klammern um Ihre Funktion und zweitens gibt es kein Semikolon am Ende der ersten Zeile. Dies ist eine dieser kniffligen Zeiten, in denen Sie versuchen müssen, sich daran zu erinnern, wo Semikolons stehen und wo nicht. Jedes Mal, wenn Sie einen "Block" oder Code haben, der von geschweiften Klammern umgeben ist, setzen Sie KEIN Semikolon hinter die öffnende geschweifte Klammer, der Grund dafür ist, dass der Compiler dies als Anweisung behandelt, es liest, weitergeht, sich die öffnende geschweifte Klammer ansieht und Wirf einen Fehler, weil vor der öffnenden geschweiften Klammer nichts war, und denkt daher, dass du einen Fehler gemacht hast (weil du es getan hast).

In Ordnung, jetzt, da wir die Grundlagen der Deklaration einer Funktion behandelt haben, lass uns reden mehr über das Innenleben der einzelnen Komponenten einer Funktion. Während wir über jede Komponente sprechen, entwickeln wir die Deklaration unserer ersten Funktion. Rückgabetyp Der Rückgabetyp ist ein äußerst wichtiger Aspekt einer Funktion, wenn ich eine Funktion erstelle und aufrufe, will ich manchmal nur, dass diese Funktion ausgeführt wird, ich interessiere mich nicht für Daten innerhalb der Funktion, ich interessiere mich nur dafür, dass sie ausgeführt wird. Das ist in Ordnung, aber manchmal möchten Sie vielleicht Daten von der Funktion zurückerhalten. Angenommen, ich habe eine Funktion, die zwei Zahlen innerhalb der Funktion addiert. Nun, ich möchte vielleicht, dass das Ergebnis der Berechnung zurückgesendet wird, damit ich es richtig verwenden kann? Nun, wie würden Sie jemals an diese Daten kommen? Die Antwort ist der Rückgabewert. Wenn wir angeben, dass eine Funktion Daten an uns zurückgeben soll, müssen wir dem Compiler mitteilen, welche Art von Daten zurückgegeben werden. Im Fall einer Funktion, die das Ergebnis einer Addition von zwei Zahlen zurückgibt, möchten wir das erhalten einen ganzzahligen Wert zurück. Das würde so aussehen:


int AddTwoNumbers("Argumente");
Der Rückgabewert ist also der Teil der Funktion, der angibt, welche Art von Daten an uns zurückgegeben werden. Jetzt fragen Sie sich vielleicht, wie Sie eine Funktion deklarieren würden, die nur Dinge tut und keine Daten an uns zurückgibt, und das ist eine großartige Frage. In diesem Fall würden wir eine sogenannte "voidfunction" erstellen. Eine void-Funktion ist eine Funktion, die keine Daten zurückgibt, sie läuft lediglich und erledigt eine Aufgabe, und das war's. Void bedeutet in Programmiersprachen im Wesentlichen nichts, und ich meine nicht, dass es keine Bedeutung hat, ich meine, es ist ein Wort, das nichts bedeutet. Um also eine Funktion zu erstellen, die nodata zurückgibt, schreiben wir die Funktion wie folgt


void DoStuff("Argumente");
Das ist es, Sie können so ziemlich jede Art von Daten oder überhaupt keine Daten zurückgeben. Wie Sie sehen, gibt es wirklich nichts dahinter, geben Sie einfach den Datentyp an, den die Funktion an Sie zurückgibt, wenn Sie Daten zurückgeben möchten, oder void, wenn Sie keine Daten zurückgeben möchten.

Funktionsname

Hier gibt es nicht viel zu diskutieren, offensichtlich kann der Funktionsname kein Name sein, der von C übernommen wird, es kann auch kein Name sein, der mit einer anderen Funktion kollidiert, die in einer Bibliothek enthalten ist, also können Sie zum Beispiel nicht Ihren schreiben Eigenes "printf()", da der C-Compiler nicht weiß, welchen er verwenden soll. Stellen Sie außerdem sicher, dass Funktionsnamen keine seltsamen Zeichen enthalten und nicht mit einer Zahl beginnen und keine Leerzeichen enthalten dürfen.

Argumente

Dies ist ein Konzept, das die Leute viel komplizierter machen, als es sein sollte. Ein Argument in einfachen Begriffen ist eine Variable, die die Variable darstellt, die ihr in der Funktion übergeben wird. Dies wird viel sinnvoller, wenn wir unsere Funktionsdefinition tatsächlich schreiben, also machen Sie sich keine Sorgen, wenn das jetzt verwirrend ist. Alle an die Funktion übergebenen Argumente müssen wie eine Variable deklariert werden. Warum brauchst du übrigens Argumente? Nun, genau wie Sie Daten von der Funktion an Sie zurückgeben möchten, möchten Sie der Funktion vielleicht einige Daten geben, mit denen sie arbeiten kann, ziemlich einfach, oder? Also lassen Sie uns das in die Praxis umsetzen. Beenden wir die Deklaration unserer AddTwoNumbers-Funktion:


int AddTwoNumbers(intnumber1, int number2);

Beachten Sie, wie ich den Argumenten Namen gegeben habe. Dies sind die Namen, die die Funktion verwendet, um die Daten darzustellen, die Sie ihr übergeben haben. Ich werde das hier rausschmeißen, aber häng dich nicht zu sehr daran auf. Manchmal, wenn Sie mit einer Funktion experimentieren und die Argumente häufig ändern, kann es wirklich lästig sein, die Argumentnamen sowohl in der Definition als auch in der Deklaration umbenennen zu müssen. Aus diesem Grund können Sie in der Deklaration, wenn Sie möchten, einfach die Daten eingeben type, aber Sie müssen noch den Namen des Arguments in der Definition angeben:


//Funktionsdeklaration int AddTwoNumbers(int,int);
//Funktionsdefinition int AddTwoNumbers(intnumber1, int number2);
Um den letzten Punkt zusammenzufassen, können Sie den Namen des Arguments in der Deklaration der Funktion weglassen, aber nicht die Definition, aber wenn Sie die Argumente in der Deklaration benennen, müssen die Argumente in der Definition genau gleich benannt werden.

Fazit

Dies war möglicherweise ein ziemlich intensiver Abschnitt für einige von Ihnen, einige von Ihnen haben möglicherweise bereits mit Funktionen oder Methoden oder etwas in dieser Art gearbeitet, also war es für Sie wahrscheinlich hauptsächlich eine Wiederholung, aber hoffentlich haben Sie etwas davon mitgenommen. Denken Sie daran, dass Funktionen die Grundlage dafür sind, wie alles in C funktioniert, so dass das Verständnis von Funktionen buchstäblich nicht verhandelbar ist, um C und die meisten High-Level-Programmierungen zu verstehen. Bevor Sie fortfahren, stellen Sie sicher, dass Sie dies verstanden haben.