いっしきまさひこBLOG

AI・機械学習関連、Web制作関連、プログラミング関連、旅行記録などなど。一色政彦。

パラメータと引数の違い

パラメータ&引数パラメータ(parameter)と引数(argument)はよく同じものとして使われますが、実際には違いがあります(わたしも混同していました……)。まぁパラメータと引数(ひきすう)は混同して使っても、意思疎通にそれほど影響出ていないので問題ないと思いますが、でもきちんと使い分けできた方がスマートかもと思いました。

その違いは簡単に言えば、次のようになるみたいです。

 ・メソッド(や関数)に定義されているのは「パラメータ」(もしくは「パラメータ変数」)。

 ・メソッド(や関数)に定義されたすべてのパラメータ群は「パラメータ リスト」と呼びます。

 ・メソッド(や関数)のパラメータに渡された値*1は「引数」(「パラメータ値」との言い換えも可能)。

 ・メソッド(や関数)のパラメータ群に渡されたすべての値群は「引数リスト」と呼びます。

パラメータは変数名という名前がありますが、引数は変数値もしくは定数やリテラルなので名前がありません。

*1<高度> 厳密には「値」(Value)というよりも「式」(Expression)。式はオペランドと演算子を組み合わせたもの。例えば「a + 2」という式では、変数値「a」や定数「2」がオペランド、「+」が演算子です。具体例は後述の *2 で書いています。

コード例で示すと以下のような感じです。

【パラメータのコード例】

次のメソッド定義のaとbはそれぞれ「パラメータ」です。

aとbをまとめて「パラメータ リスト」と呼びます。

 void SomeMethod(int a, char b);

【引数のコード例】

次のメソッド呼び出しの 3 と 'c' *2 はそれぞれ「引数」です。

3と'c'をまとめて「引数リスト」と呼びます。

 SomeMethod(3, 'c');

*2<高度> 3と'c'は式(Expression)の1つです。

例えば「SomeMethod(a+2);」という記述では、「a + 2」という式が引数です。

言葉で表すと以下のような言い方が可能です。

【パラメータの言語表現例】

 メソッドの各パラメータに引数を指定する

【引数の言語表現例】

 メソッドの第1引数を使って処理する

もう少し具体的な文章を使いながら説明しましょう。

パラメータと引数の違いは「パラメータに引数を渡す」という言葉に集約されていると思います。

例えば、次の「○」は正しい文章で、「×」は不正確です。

【パラメータの言語表現例】

○ メソッドの第1★パラメータ★「a」に★引数★「5」を渡す

× メソッドの第1★引数★「a」に★パラメータ★「5」を渡す

○ メソッドの第1★パラメータ★に「5」を渡す

× メソッドの第1★引数★に「5」を渡す

○ メソッドの第1★パラメータ★は int 型の★引数★を受け取る

× メソッドの第1★引数★は int 型の★パラメータ★を受け取る

○ コマンドライン★パラメータ★に★引数★「5」を渡す

× コマンドライン★引数★に★パラメータ★「5」を渡す

【引数の言語表現例】

× メソッドの第1★パラメータ★として「5」を渡す

○ メソッドの第1★引数★として「5」を渡す

× メソッドの第1★パラメータ★「a」のsomeメソッドを呼び出す

○ メソッドの第1★引数★「a」のsomeメソッドを呼び出す

× コマンドライン★パラメータ★を処理する

○ コマンドライン★引数★を処理する

オブジェクト指向でいえば、パラメータは型やクラスのようなもので名前はありますが実体がありません。一方、引数はオブジェクト(インスタンス)のようなもので名前はありませんが実体があると思います。

さらに、こんな法則を発見しました。以下のように「に」を「として」に置換すれば、ほとんどの「パラメータ」は「引数」に置き換え可能なようです。

○ 第1★パラメータに★「5」を指定する

× 第1★引数に★「5」を指定する

 ↓ (「に」を「として」に置換)

× 第1★パラメータとして★「5」を指定する

○ 第1★引数として★「5」を指定する

実はこのうように「として」とした場合、以下のように「パラメータに」という用語が省略されていると考えられます。

× 第1パラメータとして(第1★引数に★)「5」を指定する

○ 第1引数として(第1★パラメータに★)「5」を指定する

「パラメータ」と「引数」って日常の日本語ではないから、それが「てにをは」をうまく使いこなせなくてしいる気がします。

例えば、日常的な日本語の野球の例で考えてみると、

 「メソッド」を「野球チーム」とすれば

 「パラメータ」は「監督のポジション」、

 「引数」が「監督の人」、

となると思います。これを、いままでの書き方と同じように書いて表すと次のようになります。

【パラメータの言語表現例】

○ 野球チームの★監督のポジション★「a」に★監督の人★「郷ひろみ」を指名する

× 野球チームの★監督の人★「a」に★監督のポジション★「郷ひろみ」を指名する

○ 野球チームの★監督のポジション★に「郷ひろみ」を指名する

× 野球チームの★監督の人★に「郷ひろみ」を指名する

【引数の言語表現例】

× 野球チームの★監督のポジション★として「郷ひろみ」を指名する

○ 野球チームの★監督の人★として「郷ひろみ」を指名する

× 野球チームの★監督のポジション★「a」の笑いを引き出す

○ 野球チームの★監督の人★「a」の笑いを引き出す

× 野球チームの★監督のポジション★で「郷ひろみ」を指名する

△ 野球チームの★監督の人★で「郷ひろみ」を指名する

こう考えると、一番最後の△の文で使われている「で」という格助詞はいまいちな気がします。できれば「として」が好ましいと思います。次のようになります。

△ メソッドの第1★引数★で「5」を渡す

(△ 野球チームの★監督の人★で「郷ひろみ」を指名する)

  ↓ むしろ次のような日本語の方が美しい。

○ メソッドの第1★引数★として「5」を渡す

(○ 野球チームの★監督の人★として「郷ひろみ」を指名する)

なお、パラメータは「仮引数」(formal parameter)、引数は「実引数」(actual argument)とも呼ばれます。「仮引数」と「実引数」を合わせた日本語での総称が「引数」という考え方があり(ウィキペディア:引数)、この考え方の場合、「引数」という単語でこのどちらかを示していると考えられます。ちなみに経験的に、日本の開発者は仮引数と実引数のどちらも一緒くたに「引数」と呼んでいる人がほとんどです。

しかし、この記事では、仮引数=「パラメータ」と実引数=「引数」という考え方に基づいて説明しています。

【仮引数と実引数の言語表現例】

○ int 型の仮引数 a

△ int 型の実引数 a

○ 仮引数 a に対応する実引数 5

× 実引数 a に対応する仮引数 5

以上の「仮引数」と「実引数」の表現を「パラメータ」と「引数」という表現に置き換えると以下のようになります。

【パラメータと引数の言語表現例】

○ int 型のパラメータ a

△ int 型の引数 a

○ パラメータ a に対応する引数 5

× 引数 a に対応するパラメータ 5

上記の「int 型の実引数 a」や「int 型の引数 a」は必ずしも不正確とは限らないかもしれません。例えば「int 型である引数aのSomeメソッドを呼び出して」というような表現は間違えではありません。

このようにパラメータと引数は、コンテキストにより、正しくも、不正確にもなるので、一概に「これはOK」「これはNG」とはいえないところがあります。

以上の情報は、次のリンク先の情報をシンプルにまとめたものです。

MSDN:Visual Basic 言語の概念「パラメータと引数の違い」

MSDN:Visual Basic 言語の概念「プロシージャのパラメータと引数」

Parameter (computer science) - Wikipedia, the free encyclopedia