22. Funktionen I

Auch wenn Funktionen in C etwas anders aussehen als in Python, gilt doch weiterhin:

Programme sollten zerlegt werden in überschaubare Funktionen, von denen jede “eine Sache macht, die aber gut”.

In C geben Funktionen immer nur Werte eines bestimmten Typs zurück, und auch alle Elemente der formalen Parameterliste müssen jeweils einen Typ haben. Syntaktisch wird das so gemacht:

funcDefinition ::= returnType functionName
  "(" parameterList ")" block
parameterList ::= [parSpecifier {"," parSpecifier }] | "void"
parSpecifier ::= typeSpecifier argumentName

Eine Funktion hat also einen Rückgabetyp (das kann void sein für eine Funktion, die nichts zurückgibt), einen Namen, eine Liste von (formalen) Parametern, und einen Funktionsrumpf, in dem lokale Variablen definiert werden können und dann die eigentlichen Anweisungen folgen.

Sehr häufig gibt eine Funktion nicht direkt ein Ergebnis zurück, sondern hat im Wesentlichen nur Seiteneffekte. Solche Funktionen sollten nach C-Konvention 0 zurückgeben, wenn sie “funktioniert” haben, der Seiteneffekt also erreicht wurde (z.B. Daten gespeichert, eine Manipulation an den Argumenten, ein Fenster geöffnet), eine Zahl ungleich 0 sonst (evtl. kann in dieser Zahl kodiert werden, was schief gegangen ist, wirklich üblich ist das aber nicht).

Variablen, die innerhalb von Blöcken definiert sind, sind auch in C lokal (dürfen aber nur am Anfang jedes Blocks definiert werden), Variablen, die außerhalb aller Blöcke definiert sind, sind auch in C global.

Das folgende Programm demonstriert das Verhalten lokaler Variablen:

#include <stdio.h>

double power(double base, int exp)
{
  int i; double res=1;

  printf("base, exp in power: "
    "%f, %d\n", base, exp);
  for (i=0; i<exp; i++) {
    res *= base;
  }
  return res;
}

int main(void)
{
  int exp=2; double base=2.3;

  printf("%f^%d = %f\n",
    base, exp, power(base, exp));
  printf("base, exp in main: "
    "%f, %d\n", base, exp);
  printf("4.2^5=%f\n", power(4.2, 5));
  return 0;
}

Seine Ausgabe ist

base, exp in power: 2.300000, 2
2.300000^2 = 5.290000
base, exp in main: 2.300000, 2
base, exp in power: 4.200000, 5
4.2^5=1306.912320


Markus Demleitner

Copyright Notice