cprintfpurely-functional

Why is printf() an impure function?


As far as I know, impure functions are those which do not always return the same value when called with the same parameters (I must be missing something, or may be wrong, correct me if I am).

So why is printf() considered to an impure function?


Solution

  • A "pure" function lacks side-effects too.

    In other words, no matter how many times you call it, a pure function will affect nothing other than its output.

    For example, foo is impure, even though it return zero:

    int x;
    int foo() { x++; return 0; }
    int bar() { return x; }
    

    If foo were pure, calling it would not affect the result of bar().

    printf is impure because its result has "side effects" -- specifically, it prints something on the screen (or in a file, etc).
    If it were pure, then you could call it a billion times and be sure nothing bad would happen.
    But if you actually call printf a million times, there certainly is a difference to the user -- it fills up his screen (or disk space, or whatever). So clearly it's not pure.

    Furthermore: If your output was redirected to be your own input (somewhat useless, but still), then calling printf would affect what you would receive from getchar. :) So it's directly observable that way, too.