Lokale Variablen
In einer Funktion kannst du Variablen anlegen, genau wie in main. Eine solche Variable existiert aber nur innerhalb ihrer Funktion: Sie wird angelegt, wenn die Funktion läuft, und verschwindet, wenn die Funktion endet. Außerhalb der Funktion kennt der Compiler sie nicht:
#include <stdio.h>
void zeige_gesamt(void) {
int gesamt = 5 + 3;
printf("%d\n", gesamt);
}
int main(void) {
zeige_gesamt();
printf("%d\n", gesamt);
return 0;
}Das Programm lässt sich nicht kompilieren:
main.c:10:20: error: use of undeclared identifier 'gesamt'
10 | printf("%d\n", gesamt);
| ^~~~~~
1 error generated.In Zeile 10 versucht main, die Variable gesamt auszugeben, die nur innerhalb der Funktion zeige_gesamt existiert. „Use of undeclared identifier“ heißt, dass das Programm an dieser Stelle einen Namen verwendet, den der Compiler nicht kennt. Mit Parametern ist es genauso: Sie existieren nur innerhalb ihrer Funktion.
Eine Variable, die in einer Funktion angelegt wird, ist lokal: Sie gehört nur zu dieser Funktion. Der Teil eines Programms, in dem eine Variable existiert, heißt ihr Gültigkeitsbereich. Du weißt schon, dass eine Variable, die in einem Block angelegt wird, wie das i einer for-Schleife, nur bis zum } dieses Blocks existiert. Der Rumpf einer Funktion ist auch ein Block. Und es gilt ebenso für main, denn main ist eine Funktion: Andere Funktionen können ihre Variablen nicht sehen. Wenn eine Funktion einen Wert aus main braucht, übergib ihn als Argument.
Warum ist es gut, dass lokale Variablen in ihren Funktionen bleiben?
- Funktionen kommen sich nicht in die Quere. Zwei Funktionen können jeweils eine Variable namens
gesamthaben, und das sind zwei verschiedene Variablen: Wenn du die eine änderst, ändert sich die andere nicht. - Um eine Funktion zu benutzen, musst du nur wissen, was du ihr gibst (die Argumente) und was sie zurückgibt (der Rückgabewert). Wie sie innen funktioniert, ist ihre eigene Sache.
- Jeder Aufruf beginnt von vorn: Die Variablen der Funktion werden neu angelegt, ohne Reste vom vorigen Aufruf.
Auch ein Parameter ist eine lokale Variable. Wenn eine Funktion aufgerufen wird, bekommt ihr Parameter eine Kopie des Arguments. Wenn die Funktion ihren Parameter ändert, ändert sie nur die Kopie, und die Variable in main bleibt gleich:
#include <stdio.h>
void punktestand_zuruecksetzen(int punktestand) {
punktestand = 0;
}
int main(void) {
int punktestand = 10;
punktestand_zuruecksetzen(punktestand);
printf("%d\n", punktestand);
return 0;
}Dieses Programm gibt aus:
10Die Funktion hat ihren Parameter punktestand auf 0 gesetzt. Aber die Variable punktestand in main ist eine andere Variable, die nur denselben Namen hat, und sie blieb 10.
Die Regel lautet also: Werte gehen durch die Parameter in eine Funktion hinein und kommen mit return heraus. Wenn eine Funktion dir einen neuen Wert geben soll, gib ihn zurück und speichere ihn dort, wo du die Funktion aufrufst, zum Beispiel punktestand = bonus_addieren(punktestand, 10);. In der Lektion über Zeiger lernst du einen anderen Weg kennen: wie eine Funktion eine Variable des Codes ändern kann, der sie aufgerufen hat.
So schreibst du es:
Anweisungen
- 1
Das Programm lässt sich nicht kompilieren:
maingibtbonusaus, aber das ist ein Parameter der Funktionbonus_addierenund existiert deshalb nur innerhalb der Funktion. Lege inmainüber dem Aufruf eine Variablebonusmit dem Wert10an und übergib sie der Funktion anstelle der Zahl10. Das Programm gibt dannBonus: 10aus. - 2
Der Punktestand ist aber immer noch
50: Die Funktion hat den Bonus nur zu ihrer Kopie addiert. Behebe das: Die Funktion gibtpunktestand + bonuszurück (ihr Rückgabetyp ist alsoint), undmainspeichert das Ergebnis in seiner Variablen:punktestand = bonus_addieren(punktestand, bonus);. Das Programm gibtPunktestand: 60aus.