>>472
Cコンパイラは次の関数ポインタを受け取る関数

int twice(int (*f)(int), int x) {
    return f(f(x));
}

が副作用があるか無いかを、どうやって知れば良いの?
渡される関数ポインタfがどんなものか分からないのに。
それとも、関数ポインタが渡されるときは、常に副作用があると考えるの?

なお、Haskellの場合は、副作用の無い関数として定義できるよ。

twice :: (Int -> Int) -> Int -> Int
twice f = f . f