変数とは何だろう

変数はプログラムの基本中の基本ですから、決して避けて通ることの出来ない道です。 ある専門書によると、多くのプログラム未経験者が最初に挫折するのも変数である、と書かれています。

こんな事を書いてしまうと、驚かれるかもしれませんが、TJS2のほとんどの仕組みは変数の元に成り立っているのです。 ですから変数の扱い方を覚えてしまえば、あとは楽勝!とも言えるのです。

変数のしくみ

多くのプログラム専門書では、変数について以下のように書かれています。

変数とは「何か」を入れて置くための箱です。 プログラムではある値の代わりに、特定の文字で置き換えることが出来ます。

これだけで理解できる方は少ないと思いますので、以下の式をご覧ください。

y = 2x +3

そう、数学で使った変数と同じなのです。

方程式:y = 2x +3

xが3の時
y = 2×3+3
y = 9

yが13の時
13 = 2x+3
-2x = -13+3
-2x = -10
x = 5
				

このように変数は特定の値を入れることが出来、後からその値を自由に変えたり取り出すことが出来ます。 こうする事で、一つの計算式から複数の答えを簡単に導き出すことが出来る。 この時変動する箱xやyを変数と呼んでいるのです。

variable.png(10645 byte)

上の画像の例では、数値の12を指定したい時は箱Aを指定するだけで、数値の12が指定できるのです。

System.inform(箱A);

この時、System.inform(12);と書いてしまうと、後で12の値を変えたい時に困ります。 一箇所だけならよいのですが、複数の場面で使われると問題です。

例えば、100に変更した場合、「System.inform(12);」の部分の12を、 全て100に手作業で変えていく…という面倒な作業が待っています。 こんな手間を解消出来るのが変数を使う一番の魅力と言えるでしょう。

あ~、頭痛い!数学なんて嫌いだ!って方もご心配は無用です。 TJSと方程式は直接関係ありません。

変数に代入する

実際に変数を用意しても、何かを入れなければ使えません。 では、最初に示した図のように「12」を入れるには、どうしたら良いでしょうか?

var x;// 変数xという箱を用意

この時、変数に何も入れないとvoidという特殊な単語が入ります。 voidとは何も無い変数という意味の予約語で、これを表示しようとしても何も表示されません。 voidについては、機会を改めて説明します。

x = 12;// 変数xという箱に12を入れる

まず、=の左側に変数の名前を書き、右側に入れたいものを書きます。 xと12が等しい、という意味では無い事に注意してください。

このように、変数に何かを入れることを代入(だいにゅう)と呼びます。上記の例では「xに12を代入する」と読みます。 代入という言葉は頻繁に使いますから、これだけは覚えてください。 代入、代入…と10回くらい呪文のように唱えてください。大丈夫ですか?

数学で「=」はイコールと読み、等号を意味しますが、TJSで「=」は代入演算子と読みます。 代入演算子は「代入する時に使う記号」と覚えましょう。 「=」以外にも記号がありますが、また改めて覚えていきましょう。

さて、これで「x」という名前の箱に12という数値が入りました。 以降は「x」を指定するだけで「12」という数値を扱えるようになります。

var x = 12;
System.inform(x);
				

上のプログラムを実行すると「12」と表示されましたね?xという変数に12が入っているという証拠です。 ここで一つ注意です。12は半角で入力します。 「12」と「12」は全くの別物ですので、間違えないようにしましょう。

「x」をダブルクォート「"」で囲っていない事に注目してください。 変数を指定する際にはダブルクォートで囲わない!と覚えてください。 序盤でも少し触れましたが、どのような時にダブルクォートを使うか?は少し後でご説明します。

varって何者?

前項で、何気なく使っていた「var」という記号、これを消すとエラーになってしまいます。 一体何者?と思われるかもしれません。 TJS2リファレンスには以下のように書かれています。

TJS2 の変数は var キーワードで指定します。TJS2 では変数を宣言しなければ使うことができません。

つまり変数を使うには、先頭に「var」を書く必要がある、と覚えてください。 何故と言われても困ります。そういうもんだ!としておきましょう。

この時、変数をvarで指定する事を変数の宣言と呼びます。 (正確には、プログラムに名前を導入する事。)

変数を宣言する際は、何も代入しなくても構いません。つまり……

var a;

と書いて構いません。ここでは「a」という変数を使いますよ、という事を教えているのです。 一度、こうして宣言した変数に「var」を使う必要はありません。つまり……

var a;……変数aの宣言

a = 10;……変数aに10を代入

このように使えます。ただし、まだ宣言していない変数に代入は行えません。 つまり……

var a;……変数aの宣言

b = 10;……変数bは宣言していないのでダメ。

var b = 10;……このように宣言と同時に代入すれば平気。

ここまでは大丈夫ですか? TJSでは「この文字は変数として使いますよ」と教えてあげないと、 上の例では「b」という文字が何なのか、理解出来ないのです。 この時、変数として使うという事を教えるのがvarの役目なのです。

varには、もう一つ重要な意味があるのですが、これについては機会を改めてご説明します。

C/C++ 型の宣言は不要

変数を宣言、定義する際には型を考慮する必要はありません。つまり

int x;

float y;

のような宣言は必要無いという事です。

どうしても書き方に馴染めなければ、 intなどの部分を全てvarで置き換えて考えましょう。

もう一つの相違点は、宣言した変数を使わなくてもエラーにはなりません。 ただ、煩雑になるので、必要な分だけ変数を宣言するのが好ましいですね。

変数の命名規則

これまで、変数の名前には「x」や「y」と使ってきました。 これは、数学を思い起こしやすいようにしたものですが、TJSでは、以下の規則に従って命名することが出来ます。

  1. 名前の先頭に使える文字は英文字(a-zとA-Z)か_(アンダーライン)に限る
  2. 二文字目以降は、上に加えて「数字」が使える
  3. システムの予約語を使う事は出来ない
  4. 全角文字を使う事が出来る。
  5. 大文字と小文字は区別される

順番に見ていきましょう

(1)名前の先頭に使える文字は英文字か_(アンダーライン)に限る

var namae = 12;   ……OK
var _namae = 12;  ……OK
var 2namae = 12;  ……NG(使えない文字が先頭にある)
					

(2)二文字目以降は、上に加えて「数字」が使える

var namae1 = 12;   ……OK
var _nam2ae = 12;  ……OK
					

(3)システムの予約語を使う事は出来ない

予約語とはシステムそのもので使う言葉です。 例えば、変数宣言に使用した「var」も予約語です。 ですから…

var var = 12;

これはエラーになります。ただし、名前の中に予約語が含まれていても、エラーにはなりません。 具体的には…

var var = 12;   ……NG(予約語そのもの)
var var1 = 12;  ……OK(最後に数字が付いているので別の名前)
var _var2 = 12; ……OK
					

TJSでは、以下の文字が予約語とされています。

// 予約語の一覧
  break  continue  const  catch  class  case
  debugger  default  delete  do  extends  export
  enum  else  function  finally  false  for
  global  getter  goto  incontextof  Infinity
  invalidate  instanceof  isvalid  import  int  in
  if  NaN  null  new  octet  protected  property
  private  public  return  real  synchronized  switch
  static  setter  string  super  typeof  throw
  this  true  try  void  var  while  with
					

※TJS2リファレンスより引用。

予約語の色を変更できるテキストエディタを使用している場合、 一つずつ登録する事で、これらの文字色を変える事が出来ます。 これで変数の命名ミスが簡単に分かりますので活用しましょう。

(4)全角文字を使う事が出来る。

実は、全角文字も使う事が出来ます。

var 変数X = 12;
System.inform(変数X);
					

全角文字を変数名で使える言語を私は他に知りません。 ただ、経験上、全角文字は避けたほうが無難です。 それが「変数」なのか、単なる文字列なのかの判断が難しいからです。

(5)大文字と小文字は区別される。

var x = 12;
var X = 99;
System.inform(x);
System.inform(X);
					

上の「x」と「X」は別物です。 上のプログラムを実行して、別の変数になっている事を確認してください。

文字列を代入しよう

数値を代入して表示する事までは出来ました。 しかし、文字を表示できないと面白くないですね。 ここでは文字列を代入する方法を紹介します。

var name = "山田";
var name = '田中';
			

このように、文字列を代入するにはダブルクォーテーション(")か、 シングルクォーテーション(')で括らなければなりません。 代入に限らず、文字列を指す場合は必ずこの規則に則る必要があります。

これに当てはめると、各文の意味は以下のようになります。

var x=12;
var counts = x; ……countsにx(この例では12)を代入
var strs = "x"; ……xが"で括られているので文字のxを代入
var str2 = "12";……同じく、"で括られているので文字列の12
			

つまり、「"」や「'」で括ると、それが変数だろうが数値だろうが、全て文字列になるんだ!という事です。 いくら半角の数値を書いても"で括ればただの文字列になります。

文字列内で"や'を使う

色々試してみて、こういう文字を書きたいとします。

var name = 'I'm Yamada';

しかし、これを表示しようとするとエラーになりました。 原因は「'」の中に「'」を使っている事でした。 同じく、「"」の中に「"」を書いてもエラーになります。

var name = "これは"文字列"です";

TJSは""や''で区切られた部分を文字列として処理します。 これはつまり、上の文は二つの文が含まれている事になっているのです

文1…var name = "これは"

文2…文字列"です";

「"」「'」「\」などは、プログラム上で特殊な意味を持つ記号なので、 これ自体を表示しようとしてもうまくいきません。 ""内部の"は、文字列指定の"ではなく「"」そのもの、と表現出来れば問題は解決しそうですが。

そこで、ズバリ解決するのがエスケープシーケンスです。 文字列の中で「\」(バックスラッシュ)を書くと、その後の一文字と合わせて特殊な文字に変わります。 この「特殊な文字」の事をエスケープシーケンスと呼びます

一般的なWindowsではバックスラッシュ「\」は円記号「¥」で入力できます。 エディタでは、表示も「¥」になっていると思いますが 動作は同じなので特に問題ありません。

以降は円記号「¥」をバックスラッシュと記載します。

以下に、よく使われるエスケープシーケンスを紹介します。 他の文字についてはリファレンスを参照してください。

文字意味
\n改行を表す
\tタブ文字を表す
\'「シングルクォート(')」自体を表す
\"「ダブルクォート(")」自体を表す
\\バックスラッシュ「\」自体を表す

もうお分かりですね?この中の「\'」と「\"」を利用する事で、先ほどの問題は解決できるはずです。 「\"」と「"」は別の文字として処理されるのです。

var name = 'I\'m Yamada';
var name2 = "これは\"文字列\"です";
System.inform(name);
System.inform(name2);
				

これでエラーなく表示する事が出来ました。めでたしめでたしです。

変数の命名例

ここまでの説明で、変数に名前を付けることはバッチリですね? でも、変数の名前ってどういう風に付けていますか? いい加減な名前を付けていると、後からプログラムを見た時に、 「あれ?この変数って何だっけ?」なんて事になりかねません。

ここでは、名前付けに困ってる方の為に、 いくつかの例を示します。 尚、これらは例の一部なので、必ずこうしなさい、というものではありません。 ご自分で分かり易い命名規則を是非見つけてください。

大文字タイプ

全て大文字で記述します。予約語と区別しやすいという利点があります。

var NAME="山田";

var NAME_MAN1="山田"; …文字の区切りに( _ )を使用する

小文字タイプ

大文字タイプの逆です。C系から来る方はこちらがお勧め。

var name="山田";

var name_man1="山田"; …文字の区切りに( _ )を使用する

先頭大文字タイプ

先頭のみ大文字にします。単語が変われば、再度大文字にします。

var Name="山田";

var ManName="山田";

先頭小文字タイプ

変数名の最初の単語だけを全て小文字にし、以降の単語は「先頭大文字タイプ」と同一です。

var name="山田";

var manName="山田";

var manFirstName="山田";

ローマ字タイプ

これは、名前の付け方そのものの問題です。 単語を英語ではなく、ローマ字で付けます。 見栄えは悪いですが、最も視覚的に分かり易いものです。

var namae="山田";

var otokoNamae="山田";

var otokoHazimenoNamae="山田";

*大文字、小文字の切り替えは先述の四項目を参考になさってください。