変数_(プログラミング)
[Wikipedia|▼Menu]
.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%;font-size:90%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}html.client-js body.skin-minerva .mw-parser-output .mbox-text-span{margin-left:23px!important}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}

この記事には複数の問題があります。改善やノートページでの議論にご協力ください。

出典がまったく示されていないか不十分です。内容に関する文献や情報源が必要です。(2012年11月)


独自研究が含まれているおそれがあります。(2019年4月)
出典検索?: "変数" プログラミング ? ニュース ・ 書籍 ・ スカラー ・ CiNii ・ J-STAGE ・ NDL ・ dlib.jp ・ ジャパンサーチ ・ TWL

プログラミングにおける変数(へんすう、: variable)とは、高水準言語プログラムソースコードにおいて、扱うデータを読み書きする記憶域 (storage) のことであり、固有の名前識別子)によって識別される[1]。変数を用いることで、データを一定期間記憶し必要なときに利用することができる。高水準言語において、変数は記憶装置(メモリ)を抽象化する役割を果たす。

一人一人の人間が異なる名前によって区別されるように、変数も個々の名前によって区別される。これにより、プログラム上で複数のデータを容易に識別・管理することができる。変数の識別子 (identifier) のことを変数名 (variable name) という。一般に、変数が表すデータをその変数の(あたい、: value)という。
変数の宣言と代入と参照

通例、プログラムにおいて変数を扱うための主要な操作は、宣言・代入・参照の三つである。プログラミング言語によって変数の扱い方は多少異なるので、ここでは一般的な事柄を述べるにとどめる。実際のプログラミング言語の仕様(規格票)の表現とは、いずれも一致しないかもしれない(一般に、言語によって用語の意味も異なる)。
宣言

プログラムの中でどのような名前の変数を用いるのかを、プログラミング言語の文法にのっとって明確に示すことを変数の宣言(せんげん、: declaration)という。

ほとんどの静的型付けプログラミング言語では、変数を宣言する際にその名前だけでなくそのデータ型も指定する必要がある。これにより、各変数が扱うことのできるデータの種類を制限でき、プログラムの型安全性が保証できる。一般に、データに対して行なえる処理はデータ型によって異なるので、データ型を厳密に検査することで、誤ったプログラムを書いてしまうことを防止するのに役立つ。

動的プログラミング言語では通例動的型付けが行なわれ、宣言なしに変数を使うことができる。

多くの静的型付けプログラミング言語では、プログラム側で型を明示しなくても、言語処理系(コンパイラ)が型システムに基づいて自動的に文脈から型を推論する機能があり、これを型推論 (type inference) と呼ぶ。型推論をサポートする言語では、変数宣言時の初期化式(右辺値)から型を推論し、型名の記述を省略することもできる。ただしバリアント型(英語版)や動的型付けとは異なり、型推論により決定された型は不変であり、再代入によって変数が表す値の型が変わるようなことはない。関数型プログラミング言語は標準的に型推論をサポートしているが、従来の手続き型プログラミング言語(オブジェクト指向言語を含む)にも型推論の機能が導入されていることが多い。
代入

宣言した変数に対して実際にデータを関連付けることを代入(だいにゅう、: substitution / assignment)という。

プログラミング言語によっては、変数の宣言と代入を一度にまとめて行なうことができる。変数を宣言せずにいきなり代入できる言語もあるが、これは宣言されていない変数に対して処理系が自動的に宣言を補ってくれていると考えることができる。ある変数に対して初めて行う代入は、特に初期化(しょきか、: initialization)という。

多くの手続き型言語では、変数は複数回代入をすることができる。すでに代入を行なった変数に改めて代入をすると、その変数とそれまでのデータとの関連はなくなり、新しいデータと改めて関連付けされる。関数型言語では、一つの変数には一度しか代入できないものも多い。このような言語では、宣言と初期化を一緒に行なうのが一般的であり、また、一つの変数が常に同じ値を持つ(値が変化しない)ことが保証される(参照透過性)。関数型言語では特にこの再代入を許可しない関連付けのことを、束縛 (binding) と呼ぶ。
参照

その変数に代入したデータを利用することを、変数の参照(さんしょう、: reference)という。

一度も代入を行なっていない、つまり初期化していない変数を参照することは意味を成さず、不正である。例えば未初期化のローカル変数を参照すると、C言語C++では(コンパイルエラーにはならないものの)未定義動作を引き起こし[2]JavaC#ではコンパイルエラーを引き起こす。

しかし一部のプログラミング言語における特定の変数では、明示的な初期化式がなくとも変数を定義した段階で、自動的に何らかのデータ(通例ゼロまたはゼロに準ずる値)が既定値として変数に関連付けられる。このような場合は、初期化を明示的に記述しないまま変数を参照できる。例えばC/C++の静的記憶域期間を持つ変数や、Java/C#のフィールドなどが挙げられる。
スコープと生存期間詳細は「スコープ (プログラミング)」を参照「名前空間」も参照

変数のスコープ (scope) あるいは可視範囲とは、変数がソースコード上の「どこから可視であるか」を表す概念である。一方、変数の生存期間 (lifetime) とは、変数が持っているその内容との対応付け (binding) が、再代入などが無ければ「いつまで保持され続けるか」を表す概念である。
スコープ「スコープ (プログラミング)」を参照

変数はその変数に対して定められたソースコードの特定の範囲内からしか「見えない」。すなわち、その変数が使用可能な範囲が、その変数のスコープである。例えばC言語では、関数の中で定義した変数(仮引数およびローカル変数)はその関数の中でのみ使用できる。これにより、関数の外部から変数を使用されるのを防ぐことができる。また、スコープが異なれば、同じ名前の変数を定義することもできる。例えば関数f()の内部で定義されたxと、関数g()の内部で定義されたxは、それぞれ別々に領域が確保される。一般に、変数に限らず、なんらかの名前について「名前空間を区切るもの」が「スコープ」である。たとえば構造体のメンバ名は、構造体ごとに名前空間を持つ[3]

一つのスコープにおいて同じ名前を複数の違うものに使うことは、許されていないことが多い。あるいは許されている場合は、後から現れたものによって、そこから後では前のものは隠蔽(シャドウ)される (en:Variable shadowing) という規則の場合もある。

さらに、スコープが入れ子になっている場合にも似たようなケースがある。たとえば、C言語の「グローバル」「ソースファイルごと」「ブロック内(ローカル変数)」というスコープは、それぞれ入れ子になっていて、かつ、内側からは外側のスコープにある名前が見える(内側からは外側のスコープにある名前は見えない、というような名前空間もある)。そのような時、外側に既にある名前と同じ名前は内側では使えないという規則のこともあれば、内側で同じ名前を使うと、外側のものは隠蔽されるという規則の場合もある。

プログラミング言語には多くの種類のスコープがあるが、詳細については「スコープ (プログラミング)」の記事を参照のこと。

以上のように、スコープは実行時のものではなく、基本的にソースコード上で静的に定まるものである(「動的スコープ」という例外もあるが[4])。
生存期間

変数の生存期間(: lifetime)はプログラム実行時に記憶域割り当てが保証されている範囲である[5]

変数が生存期間内にあるとき、変数は存在し、不変のアドレスをもち、最後に書き込まれた値を取り出せる[6]。すなわち「変数」としての役割を果たす。一方生存期間外にあるとき、そのアクセスは保証されない(未定義動作[7]あるいは禁止)。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:28 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef