Mit den meisten Programmiersprachen können Sie ein chaotisches, langlaufendes Programm in ordentliche, benannte Blöcke zerlegen. Diese Blöcke werden Funktionen genannt. Sie ermöglichen es Ihnen, Code wiederzuverwenden, anstatt immer wieder dieselbe Logik neu zu schreiben. Eine Funktion nimmt Eingaben, sogenannte Parameter, entgegen und gibt ein Ergebnis aus. In C können Sie so viele Parameter übergeben, wie Sie benötigen. Dem Compiler ist die Reihenfolge der Funktionen in Ihrer Quelldatei egal, solange er den Namen der Funktion kennt, bevor er versucht, sie auszuführen.
Wir haben dies kurz mit der Funktion rand angesprochen. Es ist die einfachste mögliche Funktion. Es nimmt nichts und gibt eine ganze Zahl zurück.
„c
int rand() / von K&R – erzeugt eine Zufallszahl zwischen 0 und 32767. /
{
rand_seed = rand_seed * 1103515245 +12345;
return (unsigned int)(rand_seed / 65536) % 32768;
}
„
Die Zeile „int rand()“ teilt dem Compiler mit, dass „rand“ eine Funktion ist. Es akzeptiert keine Parameter und gibt eine Ganzzahl zurück. Diese spezielle Version hat keine lokalen Variablen. Wenn dies der Fall wäre, würden sie direkt unter der öffnenden Klammer „{“ stehen. In C können Sie Variablen an einer beliebigen Stelle nach einem „{“ deklarieren. Sie existieren, bis das passende „}“ getroffen wird. Dann verschwinden sie. Während sie aktiv sind, leben lokale Variablen auf dem Systemstapel.
Beachten Sie das Fehlen eines Semikolons nach „rand()“. Wenn Sie versehentlich eine einfügen, erhalten Sie vom Compiler eine riesige Flut von Fehlermeldungen, die keinen Sinn ergeben. Auch ohne Parameter müssen Sie die Klammern verwenden. Ohne sie deklarieren Sie keine Funktion. Sie deklarieren lediglich eine Ganzzahl.
Die Return-Anweisung und mehrere Exit-Punkte
Die return -Anweisung ist für jede Funktion, die ein Ergebnis liefert, von entscheidender Bedeutung. Es legt den zurückzugebenden Wert fest und beendet die Funktion sofort. Sie können mehrere Return-Anweisungen in einer einzelnen Funktion platzieren, um mehrere Exit-Punkte zu erstellen.
Wenn Sie die Return-Anweisung in einer Funktion vergessen, die einen Wert zurückgeben soll, wird die Funktion beendet, wenn sie auf die schließende Klammer trifft. Es gibt einen zufälligen Müllwert zurück. Die meisten modernen Compiler warnen Sie, wenn Sie einen bestimmten Wert nicht zurückgeben. C unterstützt die Rückgabe aller Typen: „int“, „float“, „char“, „struct“ und mehr.
Es gibt mehrere korrekte Möglichkeiten, die Funktion rand aufzurufen. Am häufigsten ist die Aufgabe:
„c
x=rand();
„
Hier erhält die Variable „x“ den von „rand“ zurückgegebenen Wert. Sie müssen die Klammern in den Aufruf einbeziehen, auch wenn keine Parameter vorhanden sind. Ohne sie erhält „x“ die Speicheradresse der Funktion „rand“. Das ist selten das, was Sie beabsichtigt haben.
Sie können es auch innerhalb einer Bedingung aufrufen:
„c
if (rand() > 100)
„
Oder ignorieren Sie einfach das Ergebnis:
„c
rand();
„
Im letzten Fall wird die Funktion ausgeführt, der zurückgegebene Wert wird jedoch verworfen. Möglicherweise möchten Sie dies nicht mit „rand“ tun, aber viele Funktionen verwenden den Rückgabewert als Fehlercode. Wenn Sie wissen, dass ein Fehler unmöglich ist, ist es in Ordnung, den Code zu verwerfen.
Umgang mit ungültigen Retouren
Manchmal möchte man nichts zurückgeben. Hierzu verwenden Sie den Rückgabetyp „void“.
„c
void print_header()
{
printf(“Programmnummer 1\n”);
printf(“von Marshall Brain\n”);
printf(“Version 1.0, veröffentlicht am 26.12.91\n”);
}
„
Diese Funktion gibt Text aus, gibt aber keinen Wert zurück. Du nennst es so:
„c
print_header();
„
Fügen Sie auch hier die Klammern ein. Wenn Sie sie weglassen, wird die Funktion nicht aufgerufen. Es wird auf vielen Systemen korrekt kompiliert, führt aber zu nichts.
Parameter und C-Code im alten Stil
C-Funktionen können Parameter jeden Typs akzeptieren. Hier ist eine Funktion, die die Fakultät einer Zahl berechnet:
„c
int fact(int i)
{
int j,k;
j=1;
für (k=2; k<=i; k++)
j=j*k;
Rückkehr j;
}
„
Der Parameter „i“ wird als Ganzzahl übergeben. Um mehrere Parameter zu übergeben, trennen Sie diese durch Kommas.
„c
int add (int i, int j)
{
return i+j;
}
„
C hat sich weiterentwickelt. Gelegentlich werden Sie älteren Code sehen, der im „alten Stil“ geschrieben ist. Es sieht so aus:
„c
int add(i,j)
int i;
int j;
{
return i+j;
}
„
Sie müssen in der Lage sein, diese alte Notation zu lesen. Es funktioniert genauso. Es ist nur eine andere Syntax. Sie sollten den „neuen Stil“, bekannt als ANSI C, verwenden, bei dem Typen in der Parameterliste deklariert werden. Verwenden Sie den alten Stil nur, wenn Sie wissen, dass Sie Code an jemanden mit einem Nicht-ANSI-Compiler versenden.
Warum das für alltägliche Benutzer wichtig ist
Möglicherweise schreiben Sie nicht täglich C-Funktionen. Aber zu verstehen, wie sie funktionieren, verändert Ihre Einstellung zu Software. Jedes Mal, wenn Sie in einer Web-App auf eine Schaltfläche klicken, verarbeitet wahrscheinlich eine Funktion diesen Klick, überprüft Parameter und gibt einen Status zurück. Wenn Sie jemals einen „Laufzeitfehler“ oder einen „Stapelüberlauf“ gesehen haben, sind Sie auf die Grenzen dieser Mechanismen gestoßen.
Der Unterschied zwischen der Übergabe eines Werts und der Übergabe einer Referenz (der Speicheradresse) ist eine häufige Fehlerquelle. In Hochsprachen ist dies oft verborgen. In C ist es explizit. Zu wissen, dass „rand“ ohne Klammern eine Adresse und keine Zahl zurückgibt, erspart stundenlanges Debuggen.
Die Debatte zwischen altem und neuem Stil ist bei neuen Projekten weitgehend beigelegt. ANSI C ist der Standard. Aber es gibt immer noch alte Codebasen. Wissen, wie man „int add(i,j) int i;“ liest. int j;` verhindert, dass Sie bei Code hängen bleiben, der falsch aussieht, aber perfekt funktioniert. Es ist eine Frage der Alphabetisierung.
Ist Ihnen der Stapel wirklich wichtig? Wenn Ihr Programm unerwartet abstürzt, ist der Stacktrace Ihr einziger Hinweis. Das Verschwinden lokaler Variablen, wenn sie auf die schließende Klammer treffen, ist kein Fehler. Es ist eine Funktion. Dadurch bleibt die Speichernutzung vorhersehbar.
Es gibt keine perfekte Möglichkeit, Code zu schreiben. Es gibt nur die Art und Weise, wie kompiliert wird, und die Art, wie nicht. Behalten Sie die Klammern bei. Achten Sie auf Ihre Rendite. Und gehen Sie nicht davon aus, dass der Compiler Sie vor Ihren eigenen Syntaxfehlern bewahren wird. Das wird nicht der Fall sein.






































