私の知る限り、不純な関数とは、同じパラメーターで呼び出されたときに常に同じ値を返すとは限らない関数です (何かが欠けているか、間違っている可能性があります。間違っている場合は修正してください)。
では、なぜ はprintf()
不純な関数と見なされるのでしょうか?
私の知る限り、不純な関数とは、同じパラメーターで呼び出されたときに常に同じ値を返すとは限らない関数です (何かが欠けているか、間違っている可能性があります。間違っている場合は修正してください)。
では、なぜ はprintf()
不純な関数と見なされるのでしょうか?
「純粋な」関数には副作用もありません。
つまり、何回呼び出しても、純粋な関数はその output 以外には何も影響しません。
たとえば、ゼロを返しますが、foo
不純です。
int x;
int foo() { x++; return 0; }
int bar() { return x; }
foo
が純粋な場合、それを呼び出しても の結果には影響しませbar()
ん。
printf
その結果には「副作用」があるため、不純です。具体的には、画面(またはファイルなど)に何かを出力します。
それが純粋であれば、それを何十億回も呼び出しても、何も悪いことが起こらないことを確認できます.
しかし、実際にprintf
100 万回呼び出しを行った場合、ユーザーにとっては確かに違いがあります。ユーザーの画面 (またはディスク領域など) がいっぱいになります。だから明らかにそれは純粋ではありません。
さらに、出力が自分の入力にリダイレクトされた場合 (多少役に立たないが、それでも)、呼び出しprintf
は から受け取るものに影響しますgetchar
。:) したがって、そのように直接観察することもできます。
純関数であることには 2 つの部分があります。最初に、あなたが述べたように、関数は同じ入力パラメーターに対して一貫して同じ値を返さなければならないということです。満たされていない2 番目の基準printf
は、関数が I/O やオブジェクトの変更などの副作用を持ってはならないということです。
多くの回答はprintf
、副作用として I/O があることを説明していますが、printf
他の副作用もある可能性があります。たとえば、%n
指定子を使用すると、指定したアドレスprintf
に書き込むことができます (これはセキュリティ上の脆弱性の原因となります)。
簡単に言えば、printf
不純だからI/O
です。デバイスの外部状態 (実行ごとに変化する可能性があるI/O
状態) が存在するため、定義上は不純です。I/O
プログラミングにおける純粋関数の重要性は、同じパラメーターを使用したその関数の呼び出しの結果が既にある場合、実装が純粋関数の呼び出しを最適化できることです。明らかに、printf の呼び出しでは実行できません。
PS あなたの定義でも、printf は、成功したときに 1 つの値を返し、出力デバイスのスペース不足などの I/O エラーが発生した場合に別の値を返す可能性があるため、純粋ではありません。
printf()
副作用としてI / Oデバイスへの出力が発生するため、不純です.....