1 ELEMENTARZ
I
Właściwie dobrane nazwy stanowią jednak dobry komentarz, tak że będziemy z nich często korzystać.
A teraz krótka nota historyczna: Największą zmianą różniącą ANSI C od poprzednich wersji języka jest sposób deklarowania i definiowania funkcji. Zgodnie z oryginalną definicją języka C funkcja power wyglądałaby tak:
/* power: podnieś base do potęgi n; n >= 0 */
/* (wersja w starym stylu) */
power(base, n) int base, n;
int i, p;
P = 1;
for (i = 1; i <= n; ++i) |
p = p * base; return p;
Nazwy parametrów występują w nawiasach okrągłych, a ich typy są zadeklarowane przed otwierającym nawiasem klamrowym. Przyjmuje się, że parametry bez deklaracji są typu int. (Treść funkcji jest taka sama jak poprzednio.) !
Deklaracja funkcji power na początku programu wyglądałaby tak:
int powerO;
Umieszczanie listy parametrów w deklaracji funkcji było zabronione, toteż kompilator - choćby chciał - nie mógł sprawdzić, czy funkcję power wywołano poprawnie W rzeczywistości całą deklarację można było w ogóle pominąć, gdyż przyjęto by do myślnie, że power jest funkcją zwracającą wartość typu int. i
Nowa składnia prototypu funkcji ułatwia kompilatorowi wykrywanie błędów w licz* bie argumentów lub w ich typach. Stary styl deklaracji i definicji nadal obowiązuje w opisie ANSI C, przynajmniej w okresie przejściowym; my jednak mocno polecam) używanie nowej postaci, jeśli tylko Twój kompilator potrafi ją obsłużyć.
Ćwiczenie 1.15. Napisz nową wersję programu przekształcania temperatur z p. 1.2, w której przekształceń tych dokonuje funkcja.
Jedna z właściwości funkcji języka C może nie być bliska programistom posługującym się pewnymi innymi językami programowania, zwłaszcza zaś Fortranem. W języku C wszystkie argumenty funkcji są przekazywane „przez wartość”. Oznacza to, że wywołana funkcja zamiast oryginałów otrzymuje wartości swoich argumentów w zmiennych tymczasowych. Mechanizm ten wprowadza kilka innych właściwości niż występujące przy wywołaniu „przez referencję” w językach takich jak Fortran lub przy parametrach var w Pascalu. Tam wywołany podprogram ma dostęp do oryginału argumentu, a nie do jego kopii.
Podstawowa różnica polega na tym, że w języku C wywołana funkcja nie może bezpośrednio zmienić wartości zmiennej w funkcji wywołującej; może jedynie zmienić swoją prywatną, tymczasową kopię.
Przekazywanie argumentów przez wartość nie jest jednak wadą, lecz zaletą. Zwykle prowadzi do bardziej zwartych programów z kilkoma swobodnymi zmiennymi, gdyż w wywoływanej funkcji parametry mogą być traktowane jak zwyczajnie inicjowane zmienne lokalne. W następnej wersji funkcji power skorzystano właśnie z tej właściwości.
/* power: podnieś base do potęgi n; n >= 0; wersja 2 */ int power(int base, int n)
int p;
for (p = 1; n > 0; —n) p = p * base; return p;
Parametrem n posłużono się jako zmienną tymczasową, zmniejszaną stopniowo do zera (pętla for, która biegnie wstecz). Zmienna i nie jest już dłużej potrzebna. Cokolwiek zrobiono ze zmienną n wewnątrz funkcji power, nie ma to żadnego wpływu na wartość argumentu, z którym funkcja ta została wywołana.
Można spowodować, jeśli to konieczne, aby funkcja zmieniała wartość zmiennej w funkcji wywołującej. W tym celu funkcja wywołująca musi przekazać adres zmiennej (technicznie wskaźnik do zmiennej), a funkcja wywoływana musi zadeklarować
51