1 ELEMENTARZ
/* power: podnieś base do potęgi n; n >= 0 */ int power(int base, int n)
int i, p;
p = 1;
for (i = 1; i <= n; ++i) p = p * base; return p;
Ogólnie definicja funkcji ma następującą postać:
typ-zwracanej-wartości nazwa-funkcji (deklaracje parametrów, jeśli występują)
{
deklaracje instrukcje
Definicje funkcji mogą pojawić się w dowolnej kolejności w jednym lub kilku plikacl źródłowych, przy czym żadna funkcja nie może być rozdzielona między plikami. Jeśl program źródłowy mieści się w kilku plikach, prawdopodobnie będziesz musiał wykonać więcej czynności przy tłumaczeniu i ładowaniu programu niż w przypadku jei nego pliku, który zawiera wszystko naraz. Jest to jednak zagadnienie związane z sy: ternem operacyjnym, a nie właściwość języka. Na razie zakładamy, że obie funkcji mieszczą się w tym samym pliku, ciągle więc obowiązuje wszystko to, czego naucz; łeś się o uruchamianiu programów napisanych w języku C.
W wierszu funkcji main:
printf(”%d %d %d\n”, i, power(2,i), power(-3,i));
funkcja power jest wywoływana dwukrotnie. Każde wywołanie przekazuje do nią dwa argumenty i za każdym razem funkcja wraca z liczbą przeznaczoną do sformató wania i wypisania. Wyrażenie power(2,i) ma wartość całkowitą tak samo, jak 2 oraz i (Nie wszystkie funkcje produkują wartość całkowitą; zajmiemy się tym w rozdz. 4.)
W pierwszym wierszu samej funkcji power:
power(int base, int n)
są zawarte deklaracje nazw i typów parametrów funkcji oraz typ wyniku zwracan przez funkcję. Nazwy parametrów używane przez funkcję power są dla niej całko cie lokalne i są niedostępne dla wszystkich innych funkcji, inne funkcje mogą wi
i./ rvnn\v>Jt:
nazwy) ze zmienną
bezkonfliktowo używać tych samych nazw. Dotyczy to także zmienna i z funkcji power nie ma nic wspólnego (oprócz i w funkcji main.
Zazwyczaj będziemy stosować słowo parametr dla nazwanej zmiennej występującej w nawiasach okrągłych w definicji funkcji oraz słowo argument dla wartości używanych w wywołaniu funkcji. Czasami dla takiego rozróżnienia używa się zwrotów argument formalny i argument aktualny \
Obliczona przez funkcję power wartość jest przekazywana do main za pomocą instrukcji return. Po słowie return może wystąpić dowolne wyrażenie:
return wyrażenie;
Funkcja nie musi zwracać wartości: instrukcja return bez wyrażenia oznacza, że do miejsca wywołania zostanie przekazane jedynie sterowanie - bez wartości użytecznej, tak jak to się dzieje przy „przekroczeniu końca” funkcji po napotkaniu zamykającego nawiasu klamrowego. Funkcja wywołująca może także zignorować zwracaną przez funkcję wartość.
Zauważyłeś pewnie, że na końcu main występuje instrukcja return. Ponieważ main jest taką samą funkcją jak inne, również ona może przekazywać wartość do miejsca swojego wywołania, którym w rzeczywistości jest otoczenie, w jakim wykonuje się program. Zwykle wartość powrotna równa zero oznacza normalne zakończenie działania; wartości różne od zera sygnalizują niezwykłe lub błędne okoliczności tego zakończenia. Dotychczas dla prostoty opuszczaliśmy instrukcje return w naszych funkcjach main, ale będziemy je odtąd umieszczać w programach, aby przypominać o tym, że programy powinny informować otoczenie o swoim stanie.
Deklaracja
int power(int m, int n);
tuż przed funkcją main informuje, że power jest funkcją, która oczekuje dwóch argumentów typu int i wraca z wartością typu int. Ta deklaracja, zwana prototypem funkcji, musi być zgodna z definicją i wywołaniem funkcji power. W przypadku, gdy definicja funkcji lub dowolne jej użycie nie są zgodne z prototypem, jest sygnalizowany błąd.
Nazwy parametrów nie muszą się zgadzać. Tak naprawdę, to w prototypie funkcji są one opcjonalne, a więc nasz prototyp może wyglądać tak:
int power(int, int);
Albo: parametr formalny i parametr aktualny. - Przyp. tłum.
4 - Język ANSI C 49