W pokazanej definicji int zao(float x) typem zwracanym jest int. To oznacza, że niezależnie od tego, czy w środku funkcji powstaje wartość zmiennoprzecinkowa, w instrukcji return nastąpi dopasowanie typu do int (niejawna konwersja).
Krok 1: obliczenie wyrażenia w nawiasie. Dla argumentu 3.55 mamy:
3.55 + 0.5 = 4.05. Ten wynik jest typu zmiennoprzecinkowego (co najmniej float).
Krok 2: konwersja na typ całkowity. W C++ konwersja z typu zmiennoprzecinkowego na int odbywa się przez obcięcie części ułamkowej (truncation), a nie przez zaokrąglanie. Dlatego 4.05 po konwersji daje 4.
Dlaczego pozostałe odpowiedzi są błędne?
- 3 – taki wynik mógłby się pojawić, gdyby odjęto 0.5 albo gdyby błędnie podstawiono argument; nie wynika z podanego kodu.
- 3.5 – sugeruje pomylenie działania lub oczekiwanie wyniku zmiennoprzecinkowego, ale funkcja nie zwraca float/double, tylko int.
- 4.05 – to poprawny wynik samego dodawania, jednak nie jest wynikiem funkcji, bo wartość jest jeszcze konwertowana do int.
Wskazówka praktyczna: jeśli celem jest zaokrąglanie, a nie obcinanie, używa się funkcji z <cmath>, np. std::round, std::floor lub std::ceil, zamiast polegać na samym rzutowaniu.