Nie, funkcja „nieczyste” jest funkcją z ubocznych.
Innymi słowy, nie ma znaczenia ile razy można nazwać to, czysta funkcja wpłynie nic innych niż jej wyjściu.
Na przykład foo
jest nieczyste, chociaż wrócić zerowy:
int x;
int foo() { x++; return 0; }
int bar() { return x; }
Jeśli foo
były czyste, nazywając go nie wpłynęłoby na wynik bar()
.
printf
jest nieczysty, ponieważ jego wynik ma "efekty uboczne" - w szczególności drukuje coś na ekranie (lub w pliku itp.).
Jeśli byłby czysty, mógłbyś go nazwać miliard razy i mieć pewność, że nic złego się nie stanie.
Ale jeśli zadzwonisz printf
milion razy, to na pewno jest różnica dla użytkownika - wypełnia swój ekran (lub miejsce na dysku, lub cokolwiek innego). Więc wyraźnie nie jest czysty.
Ponadto: Jeśli twoje dane wyjściowe zostały przekierowane na twoje własne dane wejściowe (nieco bezużyteczne, ale nadal), wówczas wywołanie printf
wpłynęłoby na to, co otrzymasz od getchar
. :) Tak więc jest to bezpośrednio obserwowalne.
Ta poprawna odpowiedź nie ma nic wspólnego z 'printf'. Nie odnosi się także do ** WHY ** 'printf' jest zanieczyszczone (zewnętrzne - w przeciwieństwie do wewnętrznych - efekty uboczne). –
Czy wszystkie funkcje są nieczyste. Czas wykonać (filozofia)! BTW - 'bar' zwraca x –
@DavidTitarenco: Masz rację, właśnie to dodałem, dzięki! – Mehrdad