f
не является чистым, потому что его возвращаемое значение не обязательно одинаково для тех же аргументов. Вы можете вызвать f
дважды с одинаковыми входами и получить разные выходы. Следующая программа демонстрирует это:
#include <stdio.h>
int main() {
int i = 3;
int * const x = &i;
printf("%d\n", f(x));
i = 4;
printf("%d\n", f(x));
return 0;
}
Поскольку x
не меняется между двумя вызовами, второй вызов на f(x)
может быть оптимизирован (в пользу повторного использования результата первого вызова), если f
был чистым. Очевидно, что это может привести к неправильному результату, поэтому f
не является чистым.
f2
не чист по той же причине.