Funktionen - wie Sie Ihren Code in einfache, mundgerechte Teile aufteilen können …
Bisher hatten alle Beispiele, die wir uns angesehen haben, eine einzige Funktion, main, mit dem gesamten Code. Dies gilt perfekt für kleine, einfache Programme, ist jedoch nicht wirklich praktisch, wenn Sie mehr als ein paar zehn Zeilen erhalten, und es ist Platzverschwendung, wenn Sie dasselbe mehrmals ausführen müssen. Die Aufteilung des Codes in separate Funktionen macht ihn lesbarer und ermöglicht eine einfache Wiederverwendung.
Wir haben bereits gesehen, dass Funktionen verwendet werden. Die Hauptfunktion ist eine Standard-C-Funktion, allerdings mit einem speziellen Namen. Wir haben auch die printf-Funktion gesehen, die in unseren Beispielen aufgerufen wird. Wie erstellen und nutzen wir eine eigene Funktion? Hier ein Beispiel:
#include <stdio.h> int sum (int a, int b) { int res; res = a + b; return res; } void main (void) { int y = 2; int z = sum (5, y); printf ("Die Summe von 5 und %d ist %d\n", y, z); }
Dies umfasst sowohl die main Funktion als auch eine zweite Funktion namens sum. In beiden Fällen ist die Struktur der Funktion dieselbe: eine Zeile, die den von der Funktion zurückgegebenen Wert, den Funktionsnamen und die Funktionsargumente definiert, gefolgt von einem Codeblock in geschweiften Klammern.
Schauen wir uns die sum Funktion an:
int sum (int a, int b)
Die Definition einer Funktion besteht aus drei Teilen. Der erste Teil ist der Typ des von der Funktion zurückgegebenen Werts: in diesem Fall ein int. Der zweite Teil ist der Name der Funktion: in diesem Fall sum. Schließlich stehen in runden Klammern die Argumente für die Funktion, die durch Kommas getrennt sind, und jedes wird mit seinem Typ angegeben: in diesem Fall zwei ganzzahlige Argumente, a und b.
Der Rest der Funktion befindet sich zwischen den geschweiften Klammern.
int res;
Dies deklariert eine lokale Variable für die Funktion, eine Ganzzahl namens res. Dies ist eine Variable, die nur lokal innerhalb der Funktion selbst verwendet werden kann. Innerhalb einer Funktionsdefinition deklarierte Variablen können nur innerhalb dieser Funktion verwendet werden. Wenn Sie versuchen, res innerhalb der Hauptfunktion zu lesen oder zu schreiben, wird eine Fehlermeldung angezeigt. (Sie könnten innerhalb der Hauptfunktion ein anderes int mit dem Namen res deklarieren, dies wäre jedoch eine andere Variable mit dem Namen res als die innerhalb der sum Funktion und würde sehr verwirrend werden, daher wird dies nicht empfohlen!)
res = a + b;
Das sollte klar sein! Beachten Sie, dass a und b die beiden definierten Argumente der Funktion sind. Wenn eine Funktion aufgerufen wird, wird eine lokale Kopie der Argumente erstellt und innerhalb der Funktion verwendet. Wenn Sie die Werte von a oder b innerhalb der Funktion ändern (was durchaus gültig ist), wirkt sich dies nur auf den Wert von a und b innerhalb dieser Funktion aus. Die Werte, die die Argumente in der Funktion hatten, von der aus sie aufgerufen wurden, werden nicht geändert.
return res;
Schließlich müssen wir das Ergebnis zurückgeben. Die Funktion wurde so definiert, dass sie eine Ganzzahl zurückgibt. Daher muss sie die return-Anweisung mit einem Ganzzahlwert aufrufen, um an die aufrufende Funktion zurückgegeben zu werden.
Eine Funktion muss keinen Wert zurückgeben. Wenn der Rückgabetyp auf void gesetzt ist, wird nichts zurückgegeben. In einer Funktion mit einem ungültigen Rückgabetyp ist keine return-Anweisung erforderlich. Die Funktion kehrt zurück, wenn die letzte Zeile erreicht ist. Wenn Sie jedoch vorzeitig zurückkehren möchten (z. B. im Fehlerfall), rufen Sie einfach return ohne Wert danach auf.
Schauen wir uns an, wie wir die Funktion von main aus aufrufen:
int z = sum (5, y);
$ ./myprog Die Summe von 5 und 2 ist 7 $
Oben: Die Main Funktion gibt die Werte aus, welche von der sum-Funktion zurückgegeben werden.
Die sum-Funktion gibt eine Ganzzahl zurück, daher setzen wir eine Ganzzahlvariable gleich dieser. Die Argumente, die wir für die Funktion angeben, befinden sich in runden Klammern und in derselben Reihenfolge wie in der Funktionsdefinition. In diesem Fall ist a also 5 und b der Wert von y.
Können Sie mehr als ein Ergebnis einer Funktion zurückgeben? Sie können nur einen Wert zurückgeben, aber Sie können auch Pointer verwenden, um mehrere Datenelemente an die aufrufende Funktion zurückzugeben. Betrachten Sie dieses Beispiel:
#include <stdio.h> int sum_and_diff (int a, int b, int *res) { int sum; sum = a + b; *res = a – b; return sum; } void main (void) { int b = 2; int diff; printf ("Die Summe von 5 und %d ist %d\n", b, sum_and_diff (5, b, &diff)); printf ("Die Differenz von 5 und %d ist %d\n", b, diff); }
Wir haben die sum-Funktion geändert, um sowohl die Summe als auch die Differenz der Argumente zu berechnen. Die Summe wird wie zuvor zurückgegeben, aber wir geben die Differenz auch mit Hilfe eines Pointers zurück. Denken Sie daran, dass die Argumente für eine Funktion lokale Variablen sind. Selbst wenn Sie eine in der Funktion ändern, hat dies keine Auswirkung auf den von der aufrufenden Funktion übergebenen Wert. Aus diesem Grund sind Pointer nützlich. Durch Übergeben eines Pointers ändert die Funktion nicht den Wert des Pointers selbst, sondern kann den Wert in der Variablen ändern, auf die er zeigt.
Wir rufen die Funktion also mit den selben zwei Argumenten wie zuvor auf, fügen jedoch ein drittes hinzu, einen Pointer auf die Variable, in die wir die von der Funktion berechnete Differenz schreiben möchten. In der Funktion haben wir diese Zeile:
*res = a – b;
Die Differenz wird in die Variable geschrieben, auf die res ein Pointer ist. In der Hauptfunktion rufen wir die Funktion sum_and_diff folgendermaßen auf:
sum_and_diff (5, b, &diff)
Wir geben als Pointer Argument die Adresse des Integers diff zur Funktion sum_and_diff an. Wenn die Differenz berechnet wird, wird sie in die Variable diff in der Hauptfunktion geschrieben.
$ ./myprog Die Summe von 5 und 2 ist 7 Die Differenz von 5 und 2 ist 3 $
Oben: Wenn Sie einen Pointer als ein Argument verwenden, kann die Funktion sum_and_diff sowohl die Summe als auch die Differenz der Argumente zurückgeben.
Beachten Sie beim Definieren von Funktionen, dass der Compiler Dateien von oben nach unten liest und Sie sie über eine Funktion informieren müssen, bevor Sie sie verwenden können. In den obigen Beispielen erfolgt dies automatisch, da die Definition der Funktionen sum und sum_and_diff vor dem ersten Aufruf von main erfolgt.
In größeren Dateien wird es jedoch kompliziert, wenn mehrere Funktionen mehrere andere Funktionen aufrufen. Es ist nicht immer einfach sicherzustellen, dass die Funktionsdefinitionen alle in der richtigen Reihenfolge erfolgen. Um dies zu vermeiden, können Sie mit C Funktionen deklarieren, bevor sie verwendet werden.
Eine Funktionsdeklaration ist nur die Definition der Funktion, abzüglich des Funktionscodes in den geschweiften Klammern. Für die Funktion sum_and_diff wäre die Deklaration also:
int sum_and_diff (int a, int b, int *res);
Beachten Sie das Semikolon am Ende! Funktionsdeklarationen sind am Anfang der Datei enthalten. Wenn der Compiler eine Funktionsdeklaration findet, weiß er, dass irgendwann eine Funktion mit diesem Namen, Argumenten und Rückgabetyp definiert wird, sodass er weiß, wie ein Aufruf zu verarbeiten ist, auch wenn er die Definition selbst noch nicht gesehen hat.