Section 1.6 演算子

前回System クラスの inputString メソッドを使って、入力を受け取るスクリプトを書いたわけだけど…
数値を入力しても、inputString メソッドは文字列だと見なしちゃうから、 受け取った文字列を数値に変換しなくちゃいけないんだよね…
ん、そう。
でも文字列を数値にするのは簡単なんだ。
え、そうなの?
うん。文字列を数値に変換する演算子があるからね。
ちなみに演算子ってのは計算をするために使う記号のことね。
じゃあ、足し算の『+』とかも演算子?
ん、そうだよ。
TJS には他にも色んな演算子があるから、今回は文字列を数値に変換する演算子も含めて、基本的な演算子を紹介していくね。
はーい。
じゃ、まずは『=』から。
これは単純代入演算子って言って、= の右側の計算結果を = の左側に代入するんだ。

<単純代入演算子>

var a, b;   // 変数 a と b を宣言します
a = 1;      // = の右側(1)が = の左側(変数 a)に代入されます
b = 1 + 2;  // = の右側の計算結果(3)が = の左側(変数 b)に代入されます

うん。
これは今までに何回も使ってきたから使い方わかるよ。
じゃ次は『+』ね。
これは加算演算子って言って、数値の足し算や文字列の連結のための演算子。
数値の場合は + の右側と左側を足して、 文字列の場合は + の左側の文字列の後ろに、右側の文字列を連結するよ。

<加算演算子>

var a, b, c;
a = 4 + 8;            // 変数 a には 4 + 8 の計算結果 12 が代入されます
b = "T" + "J" + "S";  // 変数 b には "T" と "J" と "S" を連結した結果の "TJS" が代入されます
c = "1+1は" + 2;      // 数値の 2 が文字列の "2" に変換されて、変数 c には文字列 "1+1は2" が代入されます

うん、これもおっけーだよ。
んじゃ、次は『-』ね。
これは減算演算子って言って、引き算をするための演算子。 - の左側の値から右側の値を引くよ。
あと、減算演算子は文字列が含まれてた場合には「文字列を数値に変換」してから計算するんだ。

<減算演算子>

var a, b;
a = 100 - 99;  // 変数 a には 100 - 99 の計算結果 1 が代入されます
b = "10" - 2;  // 文字列の "10" が数値の 10 に変換されて、変数 b には数値の 8 が代入されます

変数 a の方は普通の引き算だからわかるけど…
引き算のときは、文字列があったら逆に文字列の方が数値になるんだね…ちょっとややこしいかも。
まあね。
でも加算演算子の方がむしろ特別で、この後出てくる掛け算や割り算の演算子も、文字列があったら数値に変換するんだ。
あ、そうなの?
うん。
だって文字列の引き算とか掛け算、割り算ってのはイメージわかないでしょ。
そう言われればそうだね…
だから数値が文字列に変換されるのは足し算の時だけ、って思ってていいと思うよ。
うん、わかった。
じゃ、次は『*』。
これは乗算演算子って言って、掛け算の演算子。 * の左側の値と右側の値を掛けるよ。
文字列があった場合は、さっきも言ったように数値に変換されるんだ。

<乗算演算子>

var a, b;
a = 3 * 6;     // 変数 a には 3×6 の計算結果 18 が代入されます
b = "20" * 5;  // 文字列の "20" が数値の 20 に変換されて、変数 b には数値の 100 が代入されます

これは普通の掛け算だね。
ん、じゃ次いくね。
次は割り算をする演算子の除算演算子
これには『/』と『\』の2種類あって、どっちも左側の値を右側の値で割るんだけど、 / の方は実数型、\ の方は整数型の値になるんだ。

<除算演算子>

var a, b, c, d;
a = 10 / 4;    // 変数 a には 10÷4 の計算結果 2.5 が代入されます
b = 10 \ 4;    // 変数 b には 10÷4 の計算結果の整数部分の 2 が代入されます
c = "15" / 5;  // 文字列の "15" が数値の 15 に変換されて、変数 c には実数型の 3 が代入されます
d = "15" \ 5;  // 文字列の "15" が数値の 15 に変換されて、変数 d には整数型の 3 が代入されます
※2012/06/28:d の式に誤りがございましたので修正致しました。

\ の方は割り算の結果が整数型になるから、小数の部分が切り捨てられるんだ。
四捨五入するんじゃなくて切り捨てるの?
うん。小数部分は必ず切り捨てられるから、割り算の結果が 2.9999 とかでも 2 になるよ。
あとマイナスの時も切り捨てだから -10 \ 4-2 になるね。
そうなんだ。
次は『%』。
これは剰余算演算子って言って、左側の値を右側の値で割った余りが計算できるんだ。

<剰余算演算子>

var a, b;
a = 10 % 4;    // 変数 a には 10÷4 の余り 2 が代入されます
b = "10" % 5;  // 文字列の "10" が数値の 10 に変換されて、変数 b には 10÷5 の余り 0 が代入されます

これは余りだから整数型になるんだよね。
ん、そうだよ。
あと、 『+, -, *, /, \, %』 それぞれの演算子を単純代入演算子と組み合わせた 『+=, -=, *=, /=, \=, %=』 っていう代入演算子もあるんだ。

<代入演算子>

var a = 3, b = 3, c = 3, d = 3, e = 3, f = 3;
a += 2;  // a = a + 2 と同じなので a は 5 になります
b -= 2;  // b = b + 2 と同じなので b は 1 になります
c *= 2;  // c = c * 2 と同じなので c は 6 になります
d /= 2;  // d = d / 2 と同じなので d は 1.5 になります
e \= 2;  // e = e \ 2 と同じなので e は 1 になります
f %= 2;  // f = f % 2 と同じなので f は 1 になります

例えば += 演算子を使うと、 a = a + b って書くところを、 a += b っていう感じに簡単に書けるんだ。
ちょっと便利になる演算子だね。
あと、+=-= にちょっと似た演算子で『++』と『--』っていうのがあるんだ。
それぞれインクリメント演算子デクリメント演算子って言って、1足したり1引いたりする演算子なの。
つまり、a += 1, a -= 1 と同じ結果になるよ。

<インクリメント演算子・デクリメント演算子>

var a = 3, b = 3, c = 3, d = 3;
++a;  // 前置インクリメント演算子:a = a + 1 と同じなので a は 4 になります
b++;  // 後置インクリメント演算子:b = b + 1 と同じなので b は 4 になります
--c;  // 前置デクリメント演算子:c = c - 1 と同じなので c は 2 になります
d--;  // 後置デクリメント演算子:d = d - 1 と同じなので d は 2 になります

++-- は、こんなふうに演算子の右側か左側のどっちかに値がくるんだ。
で、++-- を左側につけるのを前置インクリメント演算子前置デクリメント演算子って言って、 右側につけるのを後置インクリメント演算子後置デクリメント演算子って言うの。
どっちにつけても結果が同じみたいだけど、何か違うの?
こういう場合には前置と後置は違った結果になるよ。

<前置と後置の違い>

var a = 3, b = 3, c = 3, d = 3;
System.inform(++a);  // 前置インクリメント演算子:先に a に 1 が加算されるので 4 と表示されます
System.inform(b++);  // 後置インクリメント演算子:3 と表示された後で b に 1 が加算されて 4 になります
System.inform(--c);  // 前置デクリメント演算子:先に c から 1 が減算されるので 2 と表示されます
System.inform(d--);  // 後置デクリメント演算子:3 と表示された後で d から 1 が減算されて 2 になります

++-- を左側につける前置の方は、inform メソッドが実行される前に1増えたり減ったりするけど、 右側につける後置の方は inform メソッドを実行した後、次の行に進む直前に1増えたり減ったりするんだ。
なんか使い分けるのが難しそう…
ん〜、でもこの後にも結構よく登場する演算子だから、そのうち使い慣れると思うよ。
そうなの?
うん。
じゃあ次は、いよいよ文字列を数値に変換する演算子、『+』演算子!
えっ? + 演算子って足し算する演算子でしょ。
実は『+』で表される演算子は2種類あるんだ。
1つは足し算だけど、もう1つは文字列を数値に変換する演算子なの。
えっ、そうなの!?
じゃあ、どうやってどっちの演算子か見分けるの?
足し算の +2項演算子で、 数値に変換する +単項演算子だから見分けられるんだ。
2項演算子と単項演算子って?
2項演算子は、演算子の両側に値がくるんだけど、単項演算子は演算子の片側にしか値がつかないんだ。
こんな感じにね。

<単項 + 演算子と2項 + 演算子>

var a, b;
a = "1" + "2";  // これは + の両側に値があるので、2項演算子(足し算)の + で、a は "12" になります
b = +"1";       // これは + の右側にしか値がないので、単項演算子(数値に変換)の + で、b は 1 になります

ほんとだ。文字列を数値に変換してる方は + の左側に値がないね。
でしょ。だから見分けられるってワケ。
これも、さっきの後置インクリメント演算子みたいに「b = "1"+;」って書くこともできるの?
ううん、それはダメ。
インクリメント・デクリメント演算子はどっち側でもOKだけど、 単項 + 演算子は + が値の左側につくって決まってるから。
じゃ、どうやったら演算子が右側につくか左側につくか判るの?
単項演算子が値の右側にだけつくか左側にだけつくか両側につけられるかは、 演算子によって違うから、演算子の記号を見ただけじゃ判らないんだ。
あ、そうなんだ…
ま、でもよく使う演算子なら覚えられると思うし、 判らなかったら TJS2 リファレンスの『式と演算子』っていう項目を見れば載ってるから。
うん、わかった。
あと - にも値が右側につく単項演算子があるんだけど、 これは何かわかるよね?
え? えっと…
a = -1;」とか。
あっ、マイナスにする演算子だ。
ん、そう。
正確にはプラスマイナスを逆にする演算子ね。
あ、そっか。
a-1 だったら、-a1 になるもんね。
そ。
あと、他にも変数のデータ型を変える単項演算子があるから、紹介しとくね。
うん。
整数型に変換する int 演算子、 実数型に変換する real 演算子、 あと文字列型に変換する string 演算子っていうのがあって、 それぞれ使い方はこんな感じ。

<型変換演算子>

var a, b, c;
a = int "123";   // 文字列の "123" を整数値の 123 に変換します
b = real "2.6";  // 文字列の "2.6" を実数値の 2.6 に変換します
c = string -20;  // 数値の -20 を文字列の "-20" に変換します

これも単項演算子の + と同じで右側に値がくるんだね。
あ、そういえば int 演算子や real 演算子も文字列を数値に変換するんだよね?
単項 + 演算子とどこが違うの?
intreal は必ずそれぞれ整数型、実数型に変換されるんだけど、 + は文字列が整数と見なせれば整数型、そうじゃなかったら実数型に変換するんだ。

<文字列を数値に変換する演算子の違い>

var a, b, c, d;
a = int "1.2";  // 1.2 を整数にするので a は 1 になります
b = real "3";   // b は実数型の 3 になります
c = +"1.2";     // 1.2 は整数ではないので c は実数型になり 1.2 が代入されます
d = +"3";       // 3 は整数と見なせるので d は整数型になり 3 が代入されます

なるほどね〜。
でもこれも使い分けが難しそうだよね…
まぁ、数値に変換する場合は、特に型にこだわりたいって言う場合じゃなければ、単項 + 演算子でいいんじゃないかな。
あ、そうなんだ。
じゃあ最後は typeof 演算子
これも単項演算子で、右側の値のデータ型を教えてくれるんだ。

typeof 演算子>

var a = 1, b = 0.1, c = "abc", d = new Date(), e;
var A, B, C, D, E;
A = typeof a;  // a は整数型なので A は "Integer" (整数という意味)になります。
B = typeof b;  // b は実数型なので B は "Real" (実数という意味)になります。
C = typeof c;  // c は文字列型なので C は "String" (文字列という意味)になります。
D = typeof d;  // d はオブジェクト型なので D は "Object" になります。
E = typeof e;  // e には何も代入されていないので E は "void" になります。

TJS の変数のデータ型は色々あるから、変数が今どのデータ型になってるか知りたいときに便利かな。
へぇ、こんな演算子もあるんだね。
演算子にはまだ他にも色々あるんだけど、これで演算子の紹介は一旦終わり。
じゃ、これで文字列を数値に変換できるようになったことだし、次回は §1.5 のスクリプトの続きを書いてくね。
また続くんだね…
うん。今回は演算子の紹介で長くなっちゃったからね。
次回はちゃんとスクリプト書いて実行するとこまで行くから。
うん、わかった。
それじゃ、また次回ね。


前へ | TOP | 次へ