関数とプロシージャの主な違いは、プロシージャが値を返す場合と返さない場合がある関数が強制的に値を返すことです。しかし、void 型の関数を使用すると、何も返されません。私の疑問を明確にしてください。
3 に答える
伝統的に、値を返すプロシージャは関数と呼ばれてきました (以下を参照)。ただし、多くの現代の言語では、プロシージャという用語を完全に省略し、すべての名前付きコード ブロックに対して関数という用語を使用することを好みます。
詳細については、Suite101: プロシージャ、サブルーチン、または関数?: プログラミング用語 101 - プロシージャ、サブルーチン、および関数のアプローチと定義の違いをご覧ください。http://www.suite101.com/content/procedure--subroutine-or-function--a8208#ixzz1GqkE7HjE
C およびその派生語では、「プロシージャ」という用語はめったに使用されません。C には、値を返す関数と返さない関数があります。これは、ANSI C に が導入される前は、値を返さvoid
ない方法がなかったCの遺産の成果物だと思います。デフォルトでは、関数はint
無視できる (無視できる) を返し、明示的な戻り値が指定されていない場合は乱数である可能性があります。
Pascal 言語ファミリでは、関数は値を返し、プロシージャは値を返さないという違いが明確に示されています。定義には、ケースごとに異なるキーワードが使用されます。Visual Basic も関数とサブルーチン (?) で区別されます。
Objective-C について話しているので、さらに混乱させる問題がいくつかあります。クラスまたはオブジェクトに関連付けられた関数は、「メソッド」として知られています (それぞれクラス メソッドとインスタンス メソッド)。
また、ペダンティックな場合は、Objective-C メソッドを呼び出すのではなく、オブジェクトにメッセージを送信してメソッドを呼び出します。メッセージ名 (別名「セレクター」) は必ずしも同じメソッドを参照するとは限らず、実行時に変更される可能性があるため、この区別は実際には非常に重要です。これは、特定のクラスの特定のメソッド名が実際にはメソッドの本体を構成するコード ブロックのアドレスの単なる記号名である Java や C++ などの言語とは根本的に異なります。
プログラミング言語によっては、区別がはっきりしない場合があります。保守的な言語Pascalを見てみましょう:
procedure
実際、戻り値はありません。戻り値を持たない操作、または複数の戻り値を持つ操作に使用されます。後者の場合、複数の引数 (return-arguments または output-arguments) は (var
キーワードを使用して) 参照によって渡され、それらの値はプロシージャ内から直接変更されます。(この後者のケースは、状況によっては良い習慣とは見なされない場合があることに注意してください)。function
単一の戻り値を持ち、通常、引数の値を変更することは期待していません (引数は、値またはconst
キーワードを介して渡されます)。複数の戻り値を返す場合は、それらを 1 つのレコードにまとめることができます。
CまたはJavaは構文的に区別されないため、戻り型の関数はvoid
プロシージャと見なすことができます。Scalaでは、メソッド ヘッドとメソッド本体の間に等号が存在することで、それらを区別していました。
一般に、実際の言語がその構造をどのように呼び出しても、理想的には
- A
function
は引数を取り、状態を変更せず (引数の変更、グローバル変数、コンソールへのユーザー情報の出力など)、計算の結果を返します。 - A
procedure
は引数を取り、副作用のある操作 (データベースへの書き込み、コンソールへの出力、変数の変更など) を実行しますが、引数を変更しないことを願っています。
ただし、実際には、状況によっては、これらの期待が混ざり合っていることが観察されます。これらのガイドラインに固執することは、私が考えるのに役立ちます.