変数と代入
コンテンツ
変数とは
プログラムを作成すると,様々な値,形式の
データを扱うことになります.それらのデータをプログラムの中で表現するためには
変数を使用します.変数はコンピュータの中でデータを一時的に入れる箱のようなものだと思ってください.
変数の名前や種類はプログラマーが決める必要があります.そのようなコードを
変数の宣言といいます.変数の宣言はその変数を使用するステートメントより上の行に記述しなければなりません(「上の行であればどこでも良い」というわけではありませんが...).具体的な変数の宣言方法は以下のようになります.
Dim 変数名 As データ型
「Dim」が変数の宣言を示しているのに対して,「As」は「~として」というデータ型を指定する場合に記述します.つまり,ステートメントとしては「”データ型”として”変数名”という名前の変数を用意します」という意味になります.
変数のデータ型には以下のようなものがあります.
データ型 |
表記方法 |
代入できる値 |
ブール型 |
Boolean |
TrueまたはFalseのみ |
バイト型 |
Byte |
整数(符号なし 1バイト): 0 ~ 255 |
文字列型 |
String |
Unicode文字 |
日付型 |
Date |
日付と時間(0文字以上の可変長)
|
文字型 |
Char |
1文字 |
10進数型 |
Decimal |
±1.0-28 ~ ±7.928 |
短整数型 |
Short |
整数(符号あり 2バイト): -32768 ~ 32767 |
整数型 |
Integer |
整数(符号あり 4バイト): -231 ~ 231-1 |
長整数型 |
Long |
整数(符号あり 8バイト): -263 ~ 263-1 |
単精度浮動小数点 |
Single |
浮動小数点: ±1.5-45 ~ ±3.438 |
倍精度浮動小数点 |
Double |
浮動小数点: ±5.0-324 ~ ±1.7308 |
変数名の付け方
変数には任意の名前をつけることが出来ます.例えば,「a」や「b」のような一文字の変数を用意することもできれば,「hensu」のような複数文字の変数を宣言することも可能です.
ただし,変数に使用できる文字には,以下のような制限があります.
使用可能な文字
- アルファベット(a~zの小文字,A~Zの大文字)
- 0~9の数字(半角文字のみ)
- 記号のアンダースコア 「_」
使用できない文字
- 仮名文字,カタカナ,漢字などで表記された文字
- 全角文字の英数字
- アンダースコア以外の記号
また,変数名の表記上のルールとして,複数文字は連続して表記しなくてはいけません.つまり,文字と文字の間をスペースであけたような変数名も不可です.さらに,変数名の最初に数字を使用することも出来ません.例えば,「x0」は大丈夫なのですが,「0x」と宣言することは出来ないので注意しましょう.
使用できる変数名,使用できない変数名の例を挙げると以下のようになります.各自,確認しておきましょう!
使用可能な変数名
- アルファベットのみ: 「a」「X」「taiju」「seibetsu」
- アルファベットと数字: 「x0」「b11」「a1m2」
- アンダースコアと英数字: 「a_b」「y_1」「ab_1c2」
使用できない変数名
- スペースを含む: 「This is a pen」
- 数字が先頭: 「0x」「11a」
- アンダースコア以外の記号を含む: 「a-b」「x++」「Y#1」
代入とは
代入では,変数にデータを入れることを「=」を使って表現します.数学ではイコール「=」は等しいという意味でしたが,プログラミングでは右辺の値を左辺の変数に入れるというステートメントに使用します.例えば,aという変数に3を代入するためには以下のようなステートメントを記述します.
Dim a As Integer
a = 3
ここでは3という数字が整数で表現できるため,整数型の変数を宣言してから代入を行っています.
また,宣言のときに直接データを代入し,変数を
初期化することもできます.
Dim a As Integer = 3
複数の変数を宣言するとき,それぞれの変数に対して上記のような定義を記述すると,複数のステートメントが続き,コードが非常に長くなります.そこで,以下のような記述の仕方をすると1行にまとめることができます.
Dim a As Integer = 3, b As Integer = 1, c As String = "hello"
ここではa,b,cという変数に対して,それぞれ3,1,"hello"を代入する初期化を行っています.
ちなみにデータ型の宣言は以下のように省くこともできます.その場合,変数のデータ型は代入されるデータに合わせて自動的に決定されます.
Dim a = 3, b = 1, c = "hello"
また,初期化なしで以下のように記述することもできます.
Dim a, b, c
この場合,a,b,cという変数に対してデータ型はまだ指定されていないので,この後に代入するデータの型によって自動的に決められていきます.
変数のスコープ
変数は宣言さえすれば,ソースコード上のどこからでも使用できるというわけではありません.変数にアクセスすることができる有効範囲を
スコープと呼びます.スコープは,ブロック単位に合わせて,以下の四つの種類があります.
① プロジェクトスコープ:
- クラス内部にあるメソッド(プロシージャ)の外で宣言された Public 変数のスコープ
- ソースコード内の全体から使用が可能であり,グローバル変数やパブリック変数と呼ばれる
- 使用の有効期間は,プログラムが終了するまで
② モジュールスコープ
- クラス内部にあるメソッド(プロシージャ)の外で宣言された Private 変数のスコープ
- 変数が宣言されたクラス内部にある全てのメソッド(プロシージャ)から使用が可能
- 使用の有効期間は,クラスが終了するまで
③ プロシージャスコープ
- メソッド(プロシージャ)の内で宣言された変数のスコープ
- 変数が宣言されたメソッド(プロシージャ)内部のみで使用が可能であり,ローカル変数と呼ばれる
- 使用の有効期間は,メソッド(プロシージャ)の実行中のみ
④ ブロックスコープ
- Ifステートメント文などのブロック内で宣言された変数のスコープ
- 変数が宣言されたブロック内部のみで使用が可能
- 使用の有効期間は,ブロックの実行中のみ
各スコープの範囲を図示すると以下のようになります.
クラス,メソッド,ブロックは入れ子構造になっています.グローバル変数とローカル変数が同じ名前になるとバグの原因になりますので,できるだけ違う名前をつけるようにしましょう.
ちなみに,もし同一名で定義するとどうなるのか?以下のプログラムで確認してみてください.
まず,フォームの上にButtonコントロールを三つ,Labelコントロールを二つ,配置してください.
次に,以下のコードを記述してください.
Public Class Form1
Dim a As Integer = 10 'モジュールスコープの変数
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim a = 1.5 'プロシージャスコープの変数
Label1.Text = a
a = a + 10
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Label1.Text = a
a = a + 10
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Label2.Text = a
End Sub
End Class
プログラムを見てもらえばわかりますが,それほど難しいことは書いていません.ただ,ここでは a というInteger型の変数をモジュールスコープで一つ宣言しているのに対して,Button1_Clickメソッドの中でもObject型の変数を一つ宣言しています.
それぞれのメソッドの中身をみていくと,まず,Button1_Clickメソッドでは,a というObject型の変数を宣言し,さらに 1.5 と初期化した後でLabel1コントロールにその値を表示させています.また,表示させた後で a という変数に 10 を加算しています.
次に,Button2_Clickメソッドでは,a という変数を宣言することなく,Label1コントロールに値を表示させています.また,その後で,a という変数に 10 を加算しています.
最後に,Button3_Clickメソッドですが,ここでは単純にLabel2コントロールに a という変数の値を表示させることのみ行っています.
さて,プログラムを実行して,それぞれのボタンを押してみると結果はどうなるでしょうか?もし出てきた値が予想外だった人は,このような変数の宣言の仕方をできるだけ避けるようにしましょう!