今回は変数と定数について話したいと思います。
変数とは
変数(variable)とは、数値や文字列といったデータを一時的に格納しておく入れ物のことです。数学でよく見られる「x + y」などの「x」と「y」が変数です。このxとyの値は「x = 1、y = 2 」や「x = 3、 y = 1.5」のように変えることができますね。このように「値を変えられる」または「値が変わる可能性がある」ものを入れておく容器が変数です。
数学の変数と異なる点は、プログラミングの変数はあらゆるデータを格納できるということです。変数には数値だけでなく、文字列や関数、オブジェクトなどを格納できます(言語によって異なります)。
ちょっと強引ですが、プログラミングの変数とは、「何でも入る出し入れ自由な入れ物」と考えると分かりやすいと思います。
変数の宣言
変数を使用する前に、その変数がどのようなものであるかをコンピュータに知らせる必要があります。つまり、使用する前に「何という名前でどのような型であるか」を定義します。これを「宣言(declaration)」といいます。
整数型の変数「pageNum」、文字型の変数「studentName」を宣言する場合、
C/C++/C#、Javaなどの場合:
int pageNum;
char studentNum;
VBA(Wordマクロなど)の場合:
Dim pageNum As Integer
Dim studentName As String
秀丸マクロの場合:宣言をしませんが、変数名の先頭に、変数が数値の場合「#」、文字列の場合「$」をつける必要があります。
JavaScriptの場合:「var」(variableの略)を使って宣言します。変数の命名規則に制限がありますが、「var」だけで数値も文字列も宣言できます。
var pageNum;
var studentNum;
言語によっては、宣言が不要で、変数がプログラム中でどのように使用されているかを判断して変数の型を推測するものもあります。これを「型推論」と呼びます。
数学の変数の場合、入れることのできる数値に制限はありませんが、プログラムの変数は入れられる値の大きさが決まっています。この大きさは変数の型(データ型)によって決まります。
例に挙げた文字型の変数studentNameの場合、宣言時に「文字型のサイズ(Javaの場合、0~65,535文字、16bit)だけメモリが確保される」ことになります。その確保されたメモリのアドレスに変数名が関連付けられます。宣言が不要なプログラム言語の場合、このメモリはコンピュータ(またはプログラム言語)によって動的に割り当てられます。
変数は値を入れておく容器といいましたが、メモリはその値を入れておく物理的な容器であり、変数名はその物理的な容器に付けられるラベルです。
コンピュータは値をメモリ上で処理します。例えば、「5 + 7」は、次のように処理されます。
- メモリのxxxx番地(アドレス)に「1」を格納する
- メモリのyyyy番地に「2」を格納する
- 「5」と「7」を足した値をメモリのzzzz番地に格納する
このようにメモリ上で値が処理されます。使用される値に必要なメモリ量よりも多い量のメモリを確保すると、使用されない無駄なメモリ領域が生じてしまいます。たとえば、上記の計算をbyte型(Java)と呼ばれる1バイト整数で実行すると3バイトのメモリサイズで済みますが、long型(Java)と呼ばれる8バイト整数で実行すると24バイトのメモリが確保され、21バイト無駄になります。次のようなイメージです(■は使用されるメモリ、□は使用されないメモリ。各1バイト)。
■■■
■■■□□□□□□□□□□□□□□□□□□□□□
その逆に必要なサイズよりも小さいサイズのデータ型を指定すると通常はエラーになります。
宣言を必要とするプログラム言語の場合、使用する値とサイズを考慮に入れ、無駄にメモリを浪費しないように適切な型を宣言することが大切です。
定数
定数(Constant)は変数とよく似ていますが、変数と違って、一度入れたデータは変更できません。決まったデータを何度も使用する場合に使います。多くの場合、定数は「組み込み定数」と「ユーザー定義定数」の2種類があります。
組み込み定数
プログラム言語にあらかじめ定義されている定数です。宣言をせずに使用できます。プログラム言語によって定数名とその値が異なります。
ユーザー定義定数
ユーザーが宣言して定義します。通常、次のように、変数名、データ型、固定値が同時に定義されます。
宣言 データ型 変数名 = 固定値
C/C++/C#の場合: const int minRate = 10;
VBAの場合: Const minRate As Integer = 10
Javaの場合: final int minRate = 10;
注:ユーザー定義定数がないプログラム言語もあります。
まとめ
変数と定数について説明しました。簡単にまとめると次のようになります。
- 変数とは、指定すれば何でも入る、出し入れ自由な入れ物
- 定数とは、一度定義して格納されたデータは変更できない入れ物
- 変数名/定数名とは、宣言によりデータ型に応じて割り当てられた物理的メモリに付けられたラベル
注:変数も定数も基本的にデータは一度に1つしか格納できません。
感覚で覚えてしまえばそれ程難しいことではありません(暴言かも…)
次回は、この変数や定数を使うための演算子について説明する予定です。
では、また。
修正・追加:オレンジのハイライト部。