Która z deklaracji funkcji w języku C++ ma parametr wejściowy typu rzeczywistego, a zwraca wartość całkowitą?
A. float fun1(void a);
B. void fun1(int a);
C. int fun1(float a);
D. float fun1(int a);
Pytanie z egzaminu CKE, czerwiec 2020 (arkusz EE.09-SG-20.06).
Deklaracja int fun1(float a); spełnia dokładnie warunek z treści pytania. W C++ zapis deklaracji funkcji czytamy według schematu: typ_zwracany nazwa_funkcji(lista_parametrów). Na początku stoi więc int, czyli funkcja po wykonaniu ma zwrócić liczbę całkowitą, na przykład 0, 15 albo -3. W nawiasie znajduje się float a, czyli parametr wejściowy o typie rzeczywistym, przechowujący liczbę z częścią ułamkową, np. 3.5 lub -0.25. Moim zdaniem to jest jeden z tych zapisów, które warto czytać bardzo spokojnie od lewej do prawej, bo łatwo pomylić typ wyniku z typem argumentu. Praktycznie taka funkcja mogłaby np. przyjmować temperaturę jako float i zwracać całkowity kod statusu, kategorię wyniku albo zaokrągloną ocenę. Dobra praktyka w C++ to świadome dobieranie typów: int dla wartości dyskretnych i float albo częściej double dla obliczeń rzeczywistych, gdy potrzebna jest większa precyzja.
W deklaracjach funkcji w C++ trzeba rozdzielić dwie rzeczy: typ wartości zwracanej oraz typy parametrów przekazywanych do funkcji. Typ zwracany znajduje się przed nazwą funkcji, a parametry są zapisane w nawiasach po nazwie. Jeśli przed nazwą stoi void, oznacza to, że funkcja niczego nie zwraca. Taka funkcja może coś wykonać, na przykład wypisać tekst albo zmienić stan programu, ale nie da się jej wyniku przypisać do zmiennej typu int. To częsty błąd myślowy: ktoś widzi w nawiasie int a i uznaje, że chodzi o wartość całkowitą zwracaną przez funkcję, a tak naprawdę to tylko typ argumentu wejściowego. Z kolei zapis float fun1(int a); działa składniowo, ale oznacza odwrotną sytuację niż w pytaniu: parametr jest całkowity, a wynik rzeczywisty. Funkcja mogłaby np. dostać liczbę sztuk i zwrócić średnią jako float, ale to nie pasuje do warunku. Szczególnie zdradliwy jest zapis z void a. W C++ void nie jest normalnym typem danych dla zmiennej ani parametru o nazwie a. Parametr typu void w takim sensie nie ma wartości, więc void a jest niepoprawną deklaracją parametru. Można spotkać zapis fun1(void) jako informację o braku parametrów, zwłaszcza w stylu znanym z C, ale nie jako nazwaną zmienną wejściową. Najbezpieczniej patrzeć na deklarację według schematu: najpierw wynik funkcji, potem nazwa, potem argumenty.