6

私の知る限り、不純な関数とは、同じパラメーターで呼び出されたときに常に同じ値を返すとは限らない関数です (何かが欠けているか、間違っている可能性があります。間違っている場合は修正してください)。

では、なぜ はprintf()不純な関数と見なされるのでしょうか?

4

6 に答える 6

17

「純粋な」関数には副作用もありません。

つまり、何回呼び出しても、純粋な関数はその output 以外には何も影響しません。

たとえば、ゼロを返しますがfoo不純です。

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

fooが純粋な場合、それを呼び出しても の結果には影響しませbar()ん。

printfその結果には「副作用」があるため、不純です。具体的には、画面(またはファイルなど)に何かを出力します。
それが純粋であれば、それを何十億回も呼び出しても、何も悪いことが起こらないことを確認できます.
しかし、実際にprintf100 万回呼び出しを行った場合、ユーザーにとっては確か違いがあります。ユーザーの画面 (またはディスク領域など) がいっぱいになります。だから明らかにそれは純粋ではありません。

さらに、出力が自分の入力にリダイレクトされた場合 (多少役に立たないが、それでも)、呼び出しprintfは から受け取るものに影響しますgetchar。:) したがって、そのように直接観察することもできます。

于 2012-08-12T05:16:12.000 に答える
8

純関数であることには 2 つの部分があります。最初に、あなたが述べたように、関数は同じ入力パラメーターに対して一貫して同じ値を返さなければならないということです。満たされていない2 番目の基準printfは、関数が I/O やオブジェクトの変更などの副作用を持ってはならないということです。

于 2012-08-12T05:17:11.263 に答える
3

多くの回答はprintf、副作用として I/O があることを説明していますが、printf他の副作用もある可能性があります。たとえば、%n指定子を使用すると、指定したアドレスprintf書き込むことができます (これはセキュリティ上の脆弱性の原因となります)。

于 2012-08-12T07:04:31.483 に答える
3

簡単に言えば、printf不純だからI/Oです。デバイスの外部状態 (実行ごとに変化する可能性があるI/O状態) が存在するため、定義上は不純です。I/O

于 2012-08-12T05:18:28.027 に答える
2

プログラミングにおける純粋関数の重要性は、同じパラメーターを使用したその関数の呼び出しの結果が既にある場合、実装が純粋関数の呼び出しを最適化できることです。明らかに、printf の呼び出しでは実行できません。

PS あなたの定義でも、printf は、成功したときに 1 つの値を返し、出力デバイスのスペース不足などの I/O エラーが発生した場合に別の値を返す可能性があるため、純粋ではありません。

于 2012-08-12T06:11:09.833 に答える
0

printf()副作用としてI / Oデバイスへの出力が発生するため、不純です.....

于 2012-08-12T05:18:35.330 に答える