コンテンツにスキップ
メインメニュー
メインメニュー
サイドバーに移動
非表示
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
Wikippe
検索
検索
表示
ログイン
個人用ツール
ログイン
引数のソースを表示
ページ
議論
日本語
閲覧
ソースを閲覧
履歴を表示
ツール
ツール
サイドバーに移動
非表示
操作
閲覧
ソースを閲覧
履歴を表示
全般
リンク元
関連ページの更新状況
ページ情報
表示
サイドバーに移動
非表示
←
引数
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
要求した操作を行うことは許可されていません。
このページのソースの閲覧やコピーができます。
'''引数'''(ひきすう、いんすう<ref>[http://it-words.jp/w/E38391E383A9E383A1E383BCE382BF.html パラメータ] [[日立ソリューションズ]]IT用語辞典</ref><ref>[http://web.mit.edu/babel/nihongo/src/kakasi/kakasidict KAKASI (Kanji Kana Simple inversion program)] [[マサチューセッツ工科大学|MIT]]</ref>、''Parameter'')とは、[[プログラミング (コンピュータ)|コンピュータープログラミング]]で用いられる用語で、'''仮引数'''と'''実引数'''の総称である。仮引数は[[サブルーチン]]や[[メソッド (計算機科学)|メソッド]]等の[[プロシージャー]]定義の部分で定義されるもので、実引数はプロシージャーを呼び出すときに指定するものである。実行時には、実引数の値を仮引数が受け取る。「引数」の読み方は、変則的に[[湯桶読み]]して「ひきすう」とするのが一般的である。数学分野で[[因数]]との取違えを防ぐためといった理由もある(数学では、parameterに一般に「[[媒介変数]]」の訳語をあてるが、「引数」を用いることもある)。 == 仮引数 == '''仮引数'''(かりひきすう、かびきすう、{{lang|en|parameter}}、{{lang|en|formal parameter (argument)}})とは、プロシージャーで定義される[[変数 (プログラミング)|変数]]のうち、実行時に呼び出し元から渡される(実引数の)値を受けるものをいう。例として[[C言語]]系言語における定義を挙げる: <syntaxhighlight lang="c"> int sum(int addend1, int addend2) { return addend1 + addend2; } </syntaxhighlight> 上の定義では、 * <code>int</code> 型の仮引数 <code>addend1</code> * <code>int</code> 型の仮引数 <code>addend2</code> 2つを伴った[[サブルーチン|関数]] <code>sum</code> を定義している。定義の中で <code>addend1</code> と <code>addend2</code> が変数のように使用されていることに注目されたい。 == 実引数 == '''実引数'''(じつひきすう、{{lang|en|argument}}、{{lang|en|actual argument (parameter)}})とは、プロシージャーを呼び出す際に渡す値のことで、プロシージャーの挙動(動作や結果)に作用する。変数や[[リテラル#コンピュータ|リテラル]]を含む[[式 (プログラミング)|式]]を指定できる。[[C言語]]系言語において前に示した例中の関数 <code>sum</code> を用いた例を挙げる: <syntaxhighlight lang="c"> sum(123, 456); </syntaxhighlight> 上の文は、 * 仮引数 <code>addend1</code> に対応する実引数 123 * 仮引数 <code>addend2</code> に対応する実引数 456 2つを関数 <code>sum</code> に渡している<ref>ちなみに、上の文の結果は 579 である</ref>。 == 値渡し == '''値渡し'''(あたいわたし、{{lang|en|call by value}})は[[右辺値]]を渡す方法で、実引数として変数を渡したとしても、その値のみが渡される。もちろん即値や複雑な式を渡すこともでき、式の評価結果が渡される。その仕組みとしては、独立した新たな[[変数 (プログラミング)|変数]]が関数内に用意され、元の値がコピーされる。そのため変数を渡したとしても、元の変数が変更されるという事はない。 これは「関数が副作用を持たない」という観点から、計算を中心とする言語では望ましい動作といえる。またそもそも代入概念のない[[関数型言語]]では、引数は必ず値で渡されると考えられる(ただし、代入が存在しない以上コピーをとる必要もない)。 値渡しを採用した言語としては[[C言語]]、[[プログラミング言語ML|ML]]、[[APL]]、[[Scheme]]、[[Java]]等が挙げられる。 === ポインタ渡し === [[C言語]]や[[C++]]の[[ポインタ (プログラミング)|ポインタ]]変数が保持する値は変数に対する参照([[メモリアドレス]])であり、後述の[[参照渡し]]の参照と似た性質を持つ。このため、ポインタ変数を値渡しすると、値渡しでありながら参照渡しと似たような効果を得ることができる。このため、ポインタ(=メモリアドレス)を値渡しする事を単なる値渡しと区別して俗に'''ポインタ渡し'''などと呼ぶ事もある。 == 変数渡し == '''変数渡し'''(へんすうわたし、{{lang|en|call by variable}})は、変数そのもの([[左辺値]])を渡す方法で、この場合は仮引数に対する操作がそのまま実引数(渡された変数)に影響する。 {{Anchor|参照渡し|}}'''参照渡し'''(さんしょうわたし、{{lang|en|call by reference}})はその実装手段の一つで、変数に対する[[参照 (情報工学)|参照]](アドレス情報)を渡す方法である。(これは言語側が勝手に行う。C言語のように明示的にアドレス演算子を使うものは参照渡しとは呼ばない。) その他、値渡しと同じようにコピーを渡しておいて、関数/サブルーチンからのリターン時に元の変数に変更結果をコピーしなおす方法もある。[[PL/I]]では、どちらの方法で実装しても良いと規定されている。 原始的な言語である[[FORTRAN]]は機械語のアドレス操作を反映した参照渡ししか持たなかった。これは特にcall by indexと呼ばれている。 他に変数渡しをサポートする言語としては、[[Pascal]]、[[Perl]]、[[C++]]、[[C Sharp|C#]]、[[Quick BASIC]]等の構造化[[BASIC]]などが挙げられる。 なお変数渡しの関数・サブルーチンに、実引数として変数以外(右辺値)を渡した場合にどうなるかは、言語によって異なる。そのような操作が禁止されており、エラーが発生する言語(Pascal、C++等)、テンポラリな変数を作成し、リターン時にそれを捨ててしまうため、値渡しと同じことができる言語(Quick BASIC等)、「未定義の動作」をひきおこし、何が起こるか全く予測がつかない言語(FORTRAN等)がある。 === 値渡しによる引数の変更 === C言語は値渡しのみをサポートするが、変数のポインタ([[メモリアドレス]])を取得することが可能であるため、変数へのポインタを値で渡す事で元の変数を変更できる。オフセット計算により配列や構造体の一部分を参照するコードも容易に記述できる。 しかしこれは、実際の変数領域を逸脱した部分をも参照できるので、あくまでも値渡しによる参照渡しのエミュレートである。参照渡しをサポートする言語でも内部的には同様の操作を行っているが、それは何らかの意味で言語の保護下にある参照となる。 === 参照の値渡し === 参照渡しで言うところの「参照」と呼ばれているものと、特定の言語で「参照」と呼ばれているものが必ずしも同じでない事には注意が必要。例えば、[[Java]]は参照型を扱うための『Javaの「参照」』を持つが、これはPascal等のポインタ相当で、『参照渡しの「参照」』とは概念が違うため、『Javaの「参照」』を渡しても参照渡しであるとは言えない。C言語の「ポインタの値渡し」と同じである<ref>[http://java-house.jp/ml/archive/j-h-b/026214.html#body JavaHouse-Brewers の議論]</ref> 。これは、Javaの参照型と似た参照型と、Javaのプリミティブ型に近い値型を持つ[[C Sharp|C#]]を見ると理解しやすいだろう。C#では、特に指定しなければ参照型も値型も値渡しされるが、引数に <code>ref</code> もしくは <code>out</code> を使用する事によって参照渡しにする事ができる。『C#の値型』を渡すから値渡し、『C#の参照型』を渡すから参照渡しとはならない。 ===例:Pascalの変数渡し=== Pascalの[[プロシージャ|手続き]](<code>procedure</code>)や[[関数 (プログラミング)|関数]](<code>function</code>)では、[[原始型]](<code>integer</code>, <code>real</code>など) の値渡しと変数渡しのどちらでも行える。変数渡しの場合は手続き・関数の引数に<code>var</code>を付ける。 <syntaxhighlight lang="pascal"> { 手続き swap 内で a,b の値を入れ替える。 sampleの i,j は変数渡しされ、aとi、bとjは同じアドレスを指して いるので、i,jの値は入れ替わる。 } procedure swap(var a,b:integer); { var をつけると変数渡し } var tmp:integer; begin tmp := a; a := b; b := tmp end; procedure sample(); var i, j:integer; begin i := 5; j := 10; swap(i, j); ... { iは10, jは5になる } end; </syntaxhighlight> == 遅延評価 == {{main|遅延評価}} [[Haskell]]などの遅延評価型関数言語に見られる形態で、値が実際に必要になるまで計算を行わない方法。概念上は、計算方法を遅延した'''thunk'''と呼ばれるオブジェクトが渡っていると考えられる。 == 名前渡し == [[ALGOL]]で採用されていた特徴的な機能の一つである。名前渡しでは値でも参照でもなく、式がそのまま渡される。基本的には参照渡しのように振る舞うが、式を参照するごとに値を計算して取り出す事が特徴である。[[C言語]]のプリプロセッサのマクロ展開と似ているが、引数と、ローカル変数が衝突しないように配慮はされる。 次のような例は名前渡しに特徴的な動作と言われる。 swap(x,y) { tmp = x; x = y; y = tmp; } この例に対し、<code>x=i, y=a[i]</code>という"式"を渡すとする。仮に<code>i=2</code>だったとすると、 ; <code>tmp = x;</code> : <code>x=i=2</code> なので<code>tmp</code>は<code>2</code>になる。 ; <code>x = y;</code> : <code>x</code>は<code>i</code>を渡されているので<code>i</code>が<code>y</code>の値になる。<code>y</code>は<code>a[i]</code>だから、<code>i</code>は<code>a</code>の2番目の値になる。 ; <code>y = tmp;</code> : <code>y</code>は<code>a</code>の<code>i</code>番目の値だが、前手順により<code>i</code>は<code>a[2]</code>になっている。従って<code>y=a[a[2]]</code>になる。 このような複雑さもあって、ALGOL以外で名前渡しが採用された事例はほとんどない。 == 脚注 == {{Reflist}} == 関連項目 == * [[変数 (プログラミング)]] * [[多重定義]] * [[評価戦略]] * [[呼出規約]] {{DEFAULTSORT:ひきすう}} [[Category:プログラミング言語の構文]] {{Computer-stub}} [[fr:Paramètre#Informatique]]
このページで使用されているテンプレート:
テンプレート:Anchor
(
ソースを閲覧
)
テンプレート:Computer-stub
(
ソースを閲覧
)
テンプレート:Lang
(
ソースを閲覧
)
テンプレート:Main
(
ソースを閲覧
)
テンプレート:Reflist
(
ソースを閲覧
)
引数
に戻る。
検索
検索
引数のソースを表示
話題を追加