Jaką wartość zwróci funkcja zao zdefiniowana w języku C++, wywołana z aktualnym parametrem 3.55?
int zao(float x){ return (x + 0.5); }
Pytanie z egzaminu CKE, wrzesień 2014 (arkusz E.14-X-14.08).
Poprawny wynik to 4. Funkcja oblicza x + 0.5, czyli 3.55 + 0.5 = 4.05, ale typ zwracany zadeklarowano jako int. Przy zwracaniu wartości zmiennoprzecinkowej z funkcji typu int kompilator wykonuje niejawną konwersję, która obcina część ułamkową (zaokrągla w stronę zera). Z 4.05 zostaje więc 4.
Dodanie 0.5 przed obcięciem to znany sposób na zaokrąglenie liczby dodatniej do najbliższej całkowitej: 3.4 + 0.5 = 3.9, co daje 3, a 3.6 + 0.5 = 4.1, co daje 4. Do zapamiętania: konwersja float na int nie zaokrągla, tylko odcina ułamek. Do zaokrąglania w C++ służy funkcja round() z biblioteki cmath.
Najczęstszy błąd w tym pytaniu to policzenie samego działania i pominięcie typu funkcji. Wynik 4.05 jest poprawną wartością wyrażenia x + 0.5, ale funkcja zadeklarowana jako int nie może zwrócić liczby z częścią ułamkową - zostanie ona odcięta. Wynik 3.5 też ma część ułamkową, więc z tego samego powodu nie może być wynikiem, a do tego nie pasuje do żadnego rachunku w kodzie.
Wynik 3 otrzymałoby się, gdyby obcięto argument jeszcze przed dodaniem 0.5 albo gdyby funkcja w ogóle nie dodawała połówki. Tak się jednak nie dzieje: parametr x jest typu float, więc przechowuje 3.55, dodawanie odbywa się na liczbach zmiennoprzecinkowych, a konwersja do int następuje dopiero przy instrukcji return. Analizując taki kod, warto zawsze ustalić kolejno: typ parametru, wartość wyrażenia i typ zwracany.