Zauważ, że pożądany wynik otrzymujesz przy kolejnej iteracji.
O co tu chodzi. Chodzi o to, że obiekt cout przy wypisywaniu buforuje sobie wartości i przy wywołaniu funkcji ma już zbuforowaną wartość zmiennej globalnej y, którą ustawiłeś na 0. Dopiero potem buforuje wartość wyniku funkcji, która zmienia wartość globalnego y. jeżeli zmienisz odrobinę kod to już masz wynik taki jaki chcesz:
int res = fun(x);
cout << res << " " << y << endl;
Nie pamiętam mechaniki działania obiektu cout, więc wiele więcej teraz nie jestem w stanie powiedzieć, ale myślę że jest to wystarczająco wyczerpująca odpowiedź.