「関数」と「手順」の違いは何ですか?


203

一般的に言えば、プログラミング言語の関数手続きについては誰もが耳にします。しかし、私はこれらの用語をほとんど同じ意味で使用していることを知りました(おそらく非常に間違っています)。

だから、私の質問は:

機能、目的、用途の違いは何ですか?

例をいただければ幸いです。


次も参照してください:stackoverflow.com/q/10388393/974555
gerrit

6
SICPはこれを正しく理解していると思います。関数は数学にのみ存在し、知識とは何かを表します。プロシージャはプログラミング関数(関数型を含む)で存在し知識の習得方法を表します関数:sqrt(x)= yで、y ^ 2 = xとなります。手順(define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0))
mk12 2014年

回答:


295

関数は値を返し、プロシージャはコマンドを実行するだけです。

名前関数は数学に由来します。入力に基づいて値を計算するために使用されます。

プロシージャは、順番に実行できる一連のコマンドです。

ほとんどのプログラミング言語では、関数でさえ一連のコマンドを持つことができます。したがって、違いは値の部分を返すことだけです。

しかし、関数をクリーンに保ちたい場合(関数型言語を見てください)、関数に副作用がないことを確認する必要があります。


命令型(java、c)または宣言型言語(scala、scheme)で副作用がないことをどのように保証できますか?
orlybg 2013年

1
@orlybg、宣言型言語では、一貫性は言語の実装に由来します。スコープの制限により、副作用を防ぐことができます。一方、命令型言語はその副作用を明示的に利用します。副作用は必ずしも悪いわけではありません。
Tharindu Rusira 2013年

私は次のAdaチュートリアル(goanna.cs.rmit.edu.au/~dale/ada/aln/8_subprograms.html)を読んでいます。このページの2番目の段落は、「Adaの手順はPascalの手順に似ています。 。プロシージャにはreturnステートメントを含めることができます。」これはテキストの誤りですか?または、それはreturnステートメントを持つことはできるが値を返さないことを意味しますか?
jviotti

3
Pascalでは、プロシージャにはreturnステートメントがなく、関数だけがあります。テキストのエラーである必要があります。ただし、プロシージャには「exit」ステートメントを含めることができます。これは、引数なしの「return」ステートメントとして機能し、戻り値がないことを意味します。
Eric Fortier、

関数は入力を取得し、出力のみを返すことができます。プロシージャまたはマクロは、入力を取得し、データを返さずに、ステートメントを実行するだけです。主な違いは、プロシージャがデータ型を返せないことです。
EsmaeelE 2017

42

これはコンテキストに依存します。

Pascalのような言語では、関数とプロシージャは別個のエンティティであり、値を返すかどうかは異なります。それらは異なる方法で動作します。言語の構文(たとえば、プロシージャコールはステートメントを形成します。式の中でプロシージャコールを使用することはできません。関数呼び出しはステートメントを形成しないため、他のステートメントで使用する必要があります)。したがって、Pascalで育ったプログラマーはそれらを区別します。

C言語のような言語や他の多くの現代言語では、この区別はなくなりました。静的に型付けされた言語では、手続きはおかしな戻り値の型を持つ単なる関数です。これがおそらく、それらが同じ意味で使用されている理由です。

関数型言語では、通常、プロシージャなどはありません-すべてが関数です。


また、プログラミング言語のドキュメントは、好きなように関数やプロシージャを呼び出すことができます。なぜなら、名前の背後にある背景がずっと前に洗い流されているため、人々は任意の名前を受け入れるからです。
Arne Babenhauserheide

18

Cの例:

// function
int square( int n ) {
   return n * n;
}

// procedure
void display( int n ) {
   printf( "The value is %d", n );
}

C標準では手続きについては触れておらず、関数についてのみ述べていることに注意してください。


4
... C標準は手続きについては話しません。関数についてのみ話します。それは機能しかないからです。何も返さない関数はvoid functionです。Kernighan&Ritchie Ch 1.7:「Cでは、関数はFortranのサブルーチンまたは関数、またはPascalのプロシージャまたは関数と同等です。」つまり、この答えは間違っています。
Mogsdad

8
答えは間違いではなく、純粋な関数とプロシージャの違いの良い例です。K&Rは、すべてのサブルーチンを単純化するために「関数」と呼びましたが、副作用のあるサブルーチンは、実際には「手続き」であり、数学の標準的な意味での「関数」ではありません。Cは、実際の関数とプロシージャを区別する場合に、より優れた言語になる可能性があります。これは、静的分析、パフォーマンスの最適化、および並列化に役立ちます。
Sam Watkins、

12

一般に、プロシージャは一連の命令です。
関数は同じでもかまいませんが、通常は結果を返します。


11

さまざまな場所から呼び出すことができるパラメーター化されたコードを表すサブルーチンまたはサブプログラムという用語があります。

関数と手順はそれらの実装です。通常、関数は値を返し、プロシージャは何も返しません。


6

基本的な違い

  • 関数は値を返す必要がありますが、ストアドプロシージャではオプションです。プロシージャは0またはnの値を返すことができます。
  • 関数は入力パラメータのみを持つことができますが、プロシージャは入力/出力パラメータを持つことができます。
  • 関数の場合、1つの入力パラメーターを取ることが必須ですが、ストアード・プロシージャーは0からn個の入力パラメーターを取る場合があります。
  • 関数はプロシージャから呼び出すことができますが、プロシージャは関数から呼び出すことはできません。

高度な違い

  • 例外はプロシージャのtry-catchブロックで処理できますが、try-catchブロックは関数では使用できません。
  • プロシージャではトランザクション管理に行くことができますが、関数ではできません。

SQLの場合:

  • A手順ことができますSELECT(だけでなく、DML INSERTUPDATEDELETE機能のみを可能にする一方で、その中に文)SELECTそれに声明を。
  • プロシージャはSELECTステートメントで使用できませんが、関数はSELECTステートメントに埋め込むことができます。
  • ストアドプロシージャは、SQLステートメントではWHERE(またはa HAVINGまたはSELECT)ブロックのどこでも使用できませんが、関数では使用できます。
  • テーブルを返す関数は、別の行セットとして扱うことができます。これはJOIN、他のテーブルと一緒にブロックで使用できます。
  • インライン関数は、パラメーターを取り、JOINブロックやその他の行セット操作で使用できるビューと考えることができます。

3
質問は言語にとらわれないものでしたが、この回答は非常に言語固有のものです。ここでの説明は一般的なケースではすべて当てはまるわけではありませんが、主張する言語または環境を明確にしておくと役立ちます。
Mogsdad 2015

5

より厳密には、関数fは、x = yの場合、f(x)= f(y)のプロパティに従います。つまり、同じ引数で呼び出されるたびに同じ結果を計算します(したがって、関数の状態は変更されません)システム。)

したがって、rand()やprint( "Hello")などは関数ではなくプロシージャです。sqrt(2.0)は関数である必要がありますが、どれだけ頻繁に呼び出しても、目に見える影響や状態の変化はなく、常に1.41とそれを返します。


3
この使用法は、「関数型」プログラミングのコンテキストでは穏やかです。サブプログラムを「関数」と呼ぶ多くの(多くの場合、必須の)言語は、このプロパティを必要としないことに注意してください。
dmckee ---元モデレーターの子猫

1
私はプログラミング言語がこの特性を要求することを提案しませんでした。とにかく、厳密な関数を任意の言語で書くことができます。クリーンな関数でできる限り多くプログラミングしてから、いくつかの主要な手順でそれらを接着するのが良い習慣だと思います。
Ingo

4

ここで言語にとらわれない場合、手順は通常、確実かつべき等で特定の結果を達成するために必要な一連の動作を指定します。つまり、プロシージャは基本的にアルゴリズムです。

一方、関数は、より大きなプログラム内のやや独立したコードの一部です。つまり、関数はプロシージャの実装です。


4

これはよく知られている古い質問ですが、現代のプログラミング言語の研究と設計について、もう少し洞察を共有したいと思います。

基本的な答え

伝統的に(構造化プログラミングの意味で)非公式に、プロシージャは「入力」を持ち、プログラム可能な何かを行うための再利用可能な構造的構造です。プロシージャ内で何かを行う必要がある場合、ソースコード(通常は一種の式)でコーディングされたプロシージャコールでプロシージャに(実際の)引数を提供し、プロシージャ本体(提供されるプロシージャの定義で)は、本文で使用される(正式な)パラメータに引数を代入して実行されます

関数は、ための手順以上である戻り値はまた、体内の「出力」として指定することができます。関数呼び出しは、関数呼び出しの結果を構文的に(通常、他のいくつかの式の部分式として)使用できることを除いて、プロシージャ呼び出しとほぼ同じです。

従来、(関数呼び出しではなく)プロシージャ呼び出しは、出力に関心がないことを示すために使用され、呼び出しが何もしないことを回避するために副作用がなければならないため、命令型プログラミングパラダイムが強調されています。Pascalのような従来のプログラミング言語の多くは、この意図的なスタイルの違いを区別するための「プロシージャ」と「関数」の両方を提供しています。

(明確に言うと、上記の「入力」と「出力」は関数の構文プロパティに基づく簡略化された概念です。多くの言語は、参照/共有によるパラメーターへの引数の受け渡しをサポートし、ユーザーが呼び出し中に引数にエンコードされた情報を転送できるようにします。そのようなパラメータは、単に「入力/出力パラメータ」と呼ばれることさえあります。この機能は、呼び出しで渡されるオブジェクトの性質に基づいており、プロシージャ/関数の機能のプロパティと直交しています。)

ただし、関数呼び出しの結果が必要ない場合は、それを(少なくとも論理的に)無視できます。関数定義/関数呼び出しは、このようにプロシージャ定義/プロシージャ呼び出しと一致している必要があります。C、C ++、JavaなどのALGOLに似た言語はすべて、このように「関数」の機能を提供します。結果の型voidを従来のプロシージャのように見える関数の特殊なケースとしてエンコードすることにより、「プロシージャ」の機能を提供する必要はありません。 " 別々に。これにより、言語設計の肥大化を防ぎます。

SICPについて言及しているため、R n RSで指定されたScheme言語では、プロシージャが計算結果を返す必要がある場合と返さない場合があることに注意してください。これは、従来の「関数」(結果を返す)と「手続き」(何も返さない)の和集合であり、基本的には多くのALGOLのような言語の「関数」の概念と同じです(実際には、呼び出し前のオペランド)。ただし、SRFI-96のような規範的なドキュメントでも、昔ながらの違いがまだあります。

発散の背後にある正確な理由についてはあまり知りませんが、私が経験したように、言語デザイナーは今日、仕様の膨張なしで幸せになるようです。つまり、スタンドアロン機能としての「手順」は不要です。voidタイプのようなテクニックは、副作用が強調されるべき使用をマークするのにすでに十分です。これは、数十年以上人気のあるC言語のような言語での経験を持つユーザーにとってもより自然なものです。さらに、R n RSのように「プロシージャ」が実際にはより広い意味での「関数」である場合に、当惑を回避します。

理論的には、関数呼び出し結果のタイプとして特定の単位タイプを使用して関数を指定し、結果が特殊であることを示すことができます。これにより、従来の手順(呼び出しの結果に関心がない場合)が他の手順と区別されます。言語の設計にはさまざまなスタイルがあります。

  • R n RSと同様に、関心のない結果を「未指定」の値(言語で言及する必要がある場合は、未指定の型)としてマークするだけで、無視するだけで十分です。
  • 専用のユニット型の値として無関心の結果を指定する(例:カーネルさんは#inert)も動作します。
  • そのタイプがさらにボトムタイプである場合、それは静的に検証され、(できれば)式のタイプとして使用されないようにすることができます。voidALGOLのような言語の型は、まさにこの手法の例です。ISO C11 _Noreturnも似ていますが、この種類ではより微妙です。

参考文献

数学から派生した伝統的な概念として、多くの人が知らなくても気にしない多くの黒魔術があります。厳密に言えば、数学の本のようにすべてを明確にすることはできません。CSの本もあまり役に立たないかもしれません。

プログラミング言語に関しては、いくつかの警告があります。

  • 数学のさまざまな分岐の関数は、常に同じ意味で定義されているわけではありません。異なるプログラミングパラダイムの関数もまったく異なる場合があります(関数呼び出しの構文が似ている場合もあります)。違いが生じる理由は同じ場合もありますが、異なる場合もあります。
    • 数学関数による計算をモデル化し基礎となる計算をプログラミング言語で実装することは慣用的です。話していることがわからない場合は、1対1でマッピングしないように注意してください。
  • モデルとモデル化するエンティティを混同しないでください。
    • 後者は前者の実装の 1つにすぎません。コンテキスト(たとえば、関心のある数学の分岐)に応じて、複数の選択肢がある場合があります。
    • 特に、「関数」を「マッピング」として扱うか、またはデカルト積のサブセットを自然数を序数のVon-Neumannエンコーディング(束のように見える{{{}}, {}}...)として扱うようにするのは、限られたコンテキスト以外にも多かれ少なかれ同様に不合理です
  • 数学的には、関数は部分的または全体的です。ここでは、プログラミング言語によって扱いが異なります。
    • 一部の関数型言語では、関数の全体を尊重して、関数呼び出し内の計算が常に有限ステップで終了することを保証します。ただし、これは本質的にチューリング完全ではないため、計算表現力が弱く、タイプチェックのセマンティクス(全体であることが期待されます)以外の汎用言語ではあまり見られません。
    • 手順と機能の違いが大きい場合、「全体の手順」があるべきでしょうか?うーん...
  • 一般的な計算プログラミング言語のセマンティクスモデル化するために使用される計算の関数に似た構成(たとえば、ラムダ計算におけるラムダ抽象化)は、オペランドに対して異なる評価戦略を持つことができます。
    • 従来の純粋な計算の削減、および純粋な関数型言語での式の評価では、計算の結果に影響を与える副作用はありません。結果として、関数のような構成の本体の前にオペランドを評価する必要はありません(「同じ結果」を定義するための不変式は、Church-Rosserプロパティによって保証されるβ等価のようなプロパティによって保持されるため)。
    • ただし、多くのプログラミング言語では、式の評価中に副作用が生じる可能性があります。つまり、アプリケーション評価のような厳密な評価戦略は、call-by-needのような厳密でない評価戦略と同じではありません。区別がなければ、関数のような(つまり、引数とともに使用される)マクロを(従来の)関数から区別する必要がないため、これは重要です。しかし、理論のフレーバーによっては、これはまだアーティファクトになる可能性があります。とはいえ、より広い意味では、関数のようなマクロ(特に衛生的なマクロ)、いくつかの不要な制限(構文フェーズ)を備えた数学関数です。制限がなければ、(ファーストクラスの)関数のようなマクロをプロシージャとして扱うのは正気かもしれません...
    • このトピックに関心がある読者は、いくつかの現代的な抽象化を検討してください
  • 手順は通常、従来の数学の範囲外と見なされます。ただし、計算およびプログラミング言語のセマンティクスをモデリングする計算、および現代のプログラミング言語の設計では、「呼び出し可能」な性質を共有する関連概念の非常に大きなファミリが存在する可能性があります。それらの一部は、プロシージャ/関数の実装/拡張/置換に使用されます。さらに微妙な違いがあります。

3

ほとんどのコンテキストでは、関数は値を返しますが、プロシージャは返しません。どちらも同じことを行うためにグループ化されたコードの一部です。

関数型プログラミングコンテキスト(すべての関数が値を返す)では、関数は抽象オブジェクトです。

f(x)=(1+x)
g(x)=.5*(2+x/2)

ここで、fはgと同じ関数ですが、手順が異なります。


3

InsideプロシージャではDML(Insert / Update / Delete)ステートメントを使用できますが、Inside関数ではDMLステートメントを使用できません。

プロシージャは両方の入力/出力パラメーターを持つことができますが、関数は入力パラメーターのみを持つことができます。

ストアドプロシージャでTry-Catchブロックを使用できますが、関数ではTry-Catchブロックを使用できません。

Selectステートメントではストアドプロシージャを使用できませんが、関数ではSelectステートメントで使用できます。

ストアドプロシージャは0またはnの値(最大1024)を返すことができますが、関数は必須である1つの値のみを返すことができます。

ストアドプロシージャは関数から呼び出すことはできませんが、ストアドプロシージャから関数を呼び出すことはできます。

ストアドプロシージャでトランザクションを使用できますが、関数ではトランザクションを使用できません。

Where / Having / selectセクションのSqlステートメントでストアドプロシージャを使用することはできませんが、関数では使用できます。

ストアドプロシージャに参加することはできませんが、関数に参加することはできます。

詳細については、ここをクリックしてください... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html


2
質問は言語にとらわれないものでしたが、この回答は非常に言語固有のものです。ここでの説明は一般的なケースではすべて当てはまるわけではありませんが、主張する言語または環境を明確にしておくと役立ちます。
Mogsdad 2015

この答えは、大多数のプログラミング言語では完全に正しくありません。プロシージャには入力パラメータのみがあり、関数には入力と出力の両方があります。
AStopher、2016年

2

関数は値を返し、プロシージャはコマンドを実行するだけです。

名前関数は数学に由来します。入力に基づいて値を計算するために使用されます。

プロシージャは、順番に実行できる一連のコマンドです。

ほとんどのプログラミング言語では、関数でさえ一連のコマンドを持つことができます。したがって、違いは値の部分を返すことだけです。

しかし、関数をクリーンに保ちたい場合(関数型言語を見てください)、関数に副作用がないことを確認する必要があります。


1

関数はSQLステートメント内で使用できますが、プロシージャはSQLステートメント内では使用できません。

Insert、Update、およびCreateステートメントを関数に含めることはできませんが、プロシージャはこれらのステートメントを持つことができます。

プロシージャはトランザクションをサポートしますが、関数はトランザクションをサポートしません。

関数は値を1つだけ返す必要があります(別の値はOUT変数で返すことができます)が、プロシージャは同じ数のデータセットと戻り値を返します。

関数とプロシージャの両方の実行プランがキャッシュされるため、どちらの場合もパフォーマンスは同じです。


1

私はこれらの答えのほとんどで何度も何度も何度も何度も見続けることに反対しています。関数を関数にするのは、それが値を返すことです。

関数は、値を返す古いメソッドだけではありません。そうではない:メソッドが実際の関数になるためには、常に特定の入力が与えられた場合と同じ値を返す必要があります。関数ではないメソッドの例として、randomほとんどの言語のメソッドがあります。これは、値を返すものの、値が常に同じであるとは限らないためです。

したがって、関数はマップに似ています(たとえばx -> x'、1次元関数の場合)。これは通常のメソッドと関数の非常に重要な違いです。実際の関数を処理する場合、タイミングと評価の順序は、非関数では常にそうであるとは限らないため、どこでも重要ではないためです。

次に、関数ではないが値を返すメソッドの別の例を示します。

// The following is pseudo code:
g(x) = {
  if (morning()) {
     g = 2 * x;
  }
  else {
   g = x;
  }
  return g;
}

さらに、プロシージャは値を返さないという概念に反対します。プロシージャは、関数またはメソッドについて話す特定の方法にすぎません。つまり、プロシージャが定義または実装する基になるメソッドが値を返す場合、そのプロシージャが値を返すものを推測します。SICPから次のスニペットを例にとります。

// We can immediately translate this definition into a recursive procedure 
// for computing Fibonacci numbers:

(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))

最近、再帰的な手続きについて聞いたことがありますか?彼らは再帰関数(実際の関数)について話していて、それは値を返し、「手続き」という単語を使用しています。それでは、違いは何ですか?

(上記の意味以外に)関数のもう1つの考え方は、数字1のような理想の抽象的な表現です。手順は、その実際の実装です。個人的には互換性があると思います。

(注、私が提供するリンクからその章を読んだ場合、理解するのが難しい概念は、関数とプロシージャの違いではなく、プロセスとプロシージャの違いであることに気付くかもしれません。再帰プロシージャには、反復プロセス?)

手順の類似体はレシピです。例えば; make-piesこのマシンと呼ばれるマシンが成分を受け取り、(fruit, milk, flower, eggs, sugar, heat)このマシンがを返すとしpieます。

このマシンの表現は次のようになります

make-pies (fruit, milk, flower, eggs, sugar, heat) = {
   return (heat (add fruit (mix eggs flower milk)))
}

もちろん、パイを作る唯一の方法ではありません。

この場合、次のことがわかります。

A       function     is to a     machine
as a    procedure    is to a     recipe
as      attributes   are to      ingredients
as      output       is to       product

その類推は問題ありませんが、コンピュータプログラムを扱う場合、すべてが抽象的であることを考慮に入れると壊れます。したがって、レシピをマシンに送る場合とは異なり、抽象化されている2つのものを比較しています。同じかもしれない二つのこと。そして、私はそれらは(すべての意図と目的のために)同じものであると考えています。


2
与えられた引数に対して常に同じ値を返す関数は、「純粋な関数」と呼ばれることがあります。プロシージャと関数を区別するほとんどの言語では、関数は純粋である必要はありません。「関数」という用語は、副作用があり、同じ引数を使用した連続した呼び出しで異なる結果を返す可能性があるサブルーチンを指すために正しく使用されます。(Cのような言語では、値を返さないサブルーチンでさえ「関数」と呼ばれます。)
キーストンプソン

同意した、それで私は言葉が交換可能であるとベイを終える理由です。
dkinzer、2014年

1
はい。しかし、「関数は単に値を返す古いメソッドではない」と言うことから始めます、多くの言語では、それはまさに関数です。
キーストンプソン

0

dbのコンテキストでは、ストアドプロシージャはプリコンパイルされた実行プランですが、as functionはありません。


0

С#/ Javaに関しては、関数は特定の値を返すコードのブロックですが、プロシージャvoid(何もない)を返すコードのブロックです。C#/ Javaでは、関数とプロシージャの両方がメソッドと呼ばれることがよくあります。

    //This is a function
    public DateTime GetCurrentDate()
    {
        return DateTime.Now.Date;
    }

    //This is a procedure(always return void)
    public void LogMessage()
    {
        Console.WriteLine("Just an example message.");
    }

-3

プロシージャ:1. プロシージャは、パラメータ化された計算を定義するステートメントのコレクションです。2.プロシージャは値を返すことができません。

3.プロシージャは関数から呼び出すことはできません。

関数 1. 関数は構造的に手順に似ていますが、意味的には数学関数に基づいてモデル化されています。2.値を返すことができます3.関数はプロシージャから呼び出すことができます。


3.プロシージャは関数から呼び出すことはできません。これはどの言語で本当ですか?私がこれまで経験したことのあるもので、この制限はありません。
Mogsdad

それは本当です。関数からプロシージャを呼び出す場合、それは関数ではありません。どの言語がこれを強制するかに関しては、それは良い質問であり、私は答えを知りません。機能的なものかもしれませんが、それでも確信はありません。純粋なリストは機能的です(セットはありません。副作用はありません)。ただし、ラムダがあるため、セットを実装できます。セットの使用を強制しないコンパイラを作成できますか?それはそのセットのすべての実装を検出する必要があります。言語からラムダを削除することもできますが、それはさらに悪くなります。
ctrl-alt-delor 2016年

ああ、私はC ++言語について考えただけです。constメソッドはnot constメソッドを呼び出すことができません(正しいコンパイラチェックをオンにする必要があり、それを回避しようとしないでください。)
ctrl-alt-delor

-7

プロシージャと関数はどちらもサブルーチンです。これらの唯一の違いは、プロシージャは複数の(または少なくとも実行可能な)値を返すのに対し、関数は1つの値しか返せないということです(これは、通常、1つの値しか見つからないため、数学で関数表記が使用される理由です)ある時点で)一部のプログラミング言語はこれらのルールに従っていないが、これはそれらの真の定義です


いいえ。手順はreturn何もしません。あなたは両方について起こり得る副作用について話している(言語で許可されている場合)。
Mogsdad 2015

プロシージャは任意の量の値を返すことができ、その量はゼロになる可能性があります
user2766296

副作用は、配列があり、それを最大値を見つけた関数またはプロシージャに渡した場合、その配列は参照によって渡され、サブルーチンが実行された後、配列がソートされたという事実です。ソートは副作用であり、返される値は配列内の最大値です
user2766296

私はこの回答が好きです。逆に、逆説的に言うと、いくつかの反対票がある人も好きです。SOで非常に人気のあるものにするために、反対票を与えます。SQL Serverのストアドプロシージャは結果セット(「複数の値」と呼ばれるもの)を返しますが、関数は1つの値しか返すことができません(テーブル値関数も作成できるため、正確ではありません)。
Ivanzinho
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.