四則演算

何かを保存出来る箱…変数を扱うと、最も相性の良い命令が出てきます。それが四則演算です。

四則演算というのは「足し算」「引き算」「掛け算」「割り算」の4つを指します。 更に、TJSでは「割り算の余り」と「割り算の小数点切捨て」という特別な計算が使えます。 通常は複雑な計算式を用いて出すべき答えを簡単に出す事が出来るので、利用しない手はありません。

以下に、四則演算に使える記号をまとめました。

記号 意味
+ 「+」の左側と右側の数値を足します。つまり足し算
- 「-」の左側から右側の数値を引きます。つまり引き算
* 「*」の左側を右側の数値で掛けます。つまり、掛け算
/ 「/」の左側を右側の数値で割ります。つまり、割り算。
% 「%」の左側を右側の数値で割った余りを出します。
「¥」の左側を右側の数値で割り、小数点は切り捨てます。

※上の「¥」は小文字で入力します

四則演算に使う演算子を算術演算子と呼びます。

  • 「*」は×と同義です。キーボードには×という記号がない為、*で表現します
  • 「/」は÷と同義です。同じく÷という記号がない為、/で表現します

「%」は数値で割った余りを出します。 「4/3」は「1、余り1」になるので「4%3」は「1」になります。

剰余算

通常「/」を使うと余りを出します。(小数点が付いてきます) 「\」は逆に余りを一切出しません。(常に整数になる) 「7/2」は「3、余り1」になるので「7\2」は「3」になります。 小数点以下を全て切り捨てる、って事ですね。

整数除算

では、簡単な計算をさせるプログラムを書いて見ましょう。

var a=10;
var b=3;

System.inform(a+b);
System.inform(a-b);
System.inform(a*b);
System.inform(a/b);
System.inform(a%b);
System.inform(a\b);
				

これを実行すると二つの問題がある事に気づくと思います。 一つは、表示した結果が「何の計算結果なのか」が分からない。 二つ目は、何度もメッセージ画面が現れて鬱陶しい! これらを解決するには、次の文字列加算を覚える必要があります。

式は値を返す

この例では演算式自体を表示させています。(変数に代入していない!) これはどういう事かと言うと、式(1+2など)は、値を返すという特徴があるからです。

2 * 3 …2×3の結果を返す。つまり「6」を返す

このように、演算式は代入される時に値を持つのではなくって、 演算結果そのものを持っていると考える方が簡単です。(使用する演算子によっても異なりますが、代入時はこの考え方で大丈夫ですよ)

算術演算子

つまり、上の例で「System.inform(a+b);」は「System.inform(13);」とほぼ同義、という事になります。 「式は代入以外の場面でも使える」これはとても重要なので、頭の片隅にでも入れておいてください。

式の考え方

式と言うと、算数では「3+5=8」のような計算式を思い出すかと思いますが、 プログラムの世界で言う式とは、少し異なります。 「式は値を返す」という考え方を使うと、以下は全て式という事になります

5 * 5 …算術式。値としては25を返す

a = b …代入。変数aに変数bの値が入り、式としては変数bの値を返す

5 …数値そのもの。式の値としては5を返す

"あ" …文字「あ」そのもの。式としては「あ」を返す

よって、プログラム命令のどこかで「式」を指定する項目があれば、 これらの「式」を指定できる、という点を覚えておくと混乱せずに済みます。

※他にも値を返す演算子(記号)によって、値を返す動作が行われる場合、 それは「式」であると捉えてください。

△戻る△

文字列加算

TJSでは文字列同士の加算が可能です。 一昔前、ウェブサイト上で「あなたは○○番目のお客様です」なんてカウント表示しているページがありましたよね。 あれは実は、文字列と来客数のカウントを加算して表示する、という仕組みなんです。

文字列の加算は、以下のように覚えてください。

「+」の左側に右側を加算する

右側が数値であれば文字列に変換されます。 つまり、左側か右側に文字列が含まれていれば、結果として文字列になるという事です。

文字列の加算

図では、左側が文字列に限定されていますが、左側が数値で右側が文字列でも同じです。 当然ですが、双方が数値ならば通常の演算が行われます。

C/C++

TJSでは文字列変数の代入も可能です。(正確にはC/C++では文字列変数自体がありませんが……) つまり、strcpy関数などを使う必要が無いという事です。 この仕様に戸惑うかもしれませんが、慣れてくると、良い意味で「いい加減」な仕様は、 非常に柔軟なプログラム作りに一役買ってくれるはずです。

var str = "文字"+6;

このように、文字列と数値を混同して加算した場合、演算式全体としては「文字列」になります。 この例でstrは「文字6」という文字列が入っています。

△戻る△

四則演算の改良

これで、四則演算するプログラムを改良出来ます。

まず、表示した結果が「何の計算結果なのか」が分からないという問題に関しては、 「"a+b="」のような文字を、結果と加算してやれば分かり易いですね。

何度もメッセージ画面が現れて鬱陶しい!という問題ですが、次の手順で克服できます。

  1. 全ての表示メッセージを加算して、それを変数に代入
  2. 加算する際は、各結果毎に改行するためエスケープ文字「\n」を入れる
  3. 結果の入った変数を「System.inform()」で表示する
var a=10;
var b=3;
// 以下は一つの文
var all = "a+b="+(a+b)+"\n"+
        "a-b="+(a-b)+"\n"+
        "a*b="+(a*b)+"\n"+
        "a/b="+(a/b)+"\n"+
        "a%b="+(a%b)+"\n"+
        "a\\b="+(a\b);
// ここまでが一つの文

System.inform(all);
				

ここでは、いくつかの注意点がありますので、押さえておきましょう。

(1)一つの文を複数行に渡って書いても良い。 最初に「一行に一文だけ書く」と記しましたが、「一文」を「二行以上」に書いても構いません。 (一行に二つ以上の命令を書くと混乱しますが、一つの命令を複数行に書いても問題は無いという事です。) その際は、空白(タブも可)を書いて表示をある程度合わせると読みやすくなります。 最後の行の「;(セミコロン)」を忘れないようにしましょう。

(2)演算式の中で「()括弧」を使うと、演算順位を変えられる。 計算の順序はご存知ですよね。まず、「×、÷」、次に「+、-」と計算します。 ここで()括弧を使うと計算順位を変えられる、というのも基本ですが、TJSも同様の考え方が出来ます。

式1……1 + 2 * 3

式2……(1 + 2) * 3

式1は、通常の演算順位から、結果は「7」

式2は、括弧を先に計算しますので、結果は「9」

各記号には処理を行う優先順位があり、()は「+-」や「÷×」よりも早く評価される為にこのような動作になります。 演算子の優先順位についてはTJS2リファレンスを参照してください。

このように、意図した演算結果が出ない場合、()括弧で括るという事を覚えておきましょう。 特に、文字列との加算を行う場合は注意が必要です。 先に掛け算をしてしまったために、「演算前」の数字を加算したいのに、「演算結果」と加算してしまった…などという事になります。

(3)「"a\\b="」で使われている「\\」はエスケープシーケンスです。「\」を単体で書くと、やはり問題が生じます。 (その後の一文字と結びついて「エスケープシーケンス」と判断されてしまう)

△戻る△

色々な代入演算

これまで「a = 1 + 2」とか、「b = 3 / 2」などという場合を見てきました。 左側に右側の演算結果を代入という形ですね。では、以下の例を見てみましょう。

a = a + 5;

うん?右側の演算式に左側の変数が使われている? 分かりづらいかもしれませんが、簡単な事です。

aが4なら a = 4 + 5;

aが20なら a = 20 + 5;

分かりづらければ、次のように考えましょう。

var a = 5;

var b = a;

a = b + 10;

bにaを代入して、bに10を加算したものをaに代入。 結果的に、aに10を加算した値がaに入った事になりますね。 慣れるまでは、このように一時的な変数を使った計算を用いても良いです。

このように「代入先の変数」と「実際に演算する変数」が同じ場合は、特別な代入を行う事が出来ます。 変数と変数の利用のところでやった、代入演算子というのを覚えていますか?

a = a + 5;

ここで使われている「=」が代入演算子、でしたよね。 この時、この式は以下のように書く事が出来ます。

a += 5;

ここで使われている「+=」も代入演算子の一つで、この式は「a = a + 5」と同義です。 他に使われる主な代入演算子をまとめて見ましょう。

演算子 意味
= 「=」の左側に右側を代入
+= 「+=」の左側に「左側と右側を足した数値(文字列)」を代入
-= 「-=」の左側に「左側から右側を引いた数値」を代入
*= 「*=」の左側に「左側に右側を掛けた数値」を代入
/= 「/=」の左側に「左側を右側で割った数値」を代入

他に「%=」や「\=」なども使えますが、意味は同じです。

a = a % 5 と a %= 5 は等しい

a = a \ 5 と a \= 5 は等しい

少々難しいと思うので、プログラムの使用例を見てください

var numbers = 100;
// 以下 numbers = numbers + ...という計算式
numbers += 50;
numbers /=2;
numbers -=5;
numbers *=10;
numbers %=200;

System.inform("numbers="+numbers);
				

ここで問題。最終的に表示される「変数numbers」の値は何でしょう? 各演算子の意味を理解する為にも、出来るだけ実行しないで考えてください。 答えが分かったら、実行して確認してから次へ進みましょう。

△戻る△

加算子と減算子

最後に加算子と減算子について説明します。 この二つも演算に使う記号の一つで、ある値から「1」だけを足したい、あるいは引きたいという時に使われます。 例えば、次の文は全て同義です。

i = i + 1;

i += 1;

i = ++i;

ここで使っている「++」を加算子またはインクリメント演算子と呼びます。 また変な用語が出てきた!と思うかもしれませんが、覚える必要は全くありません。

演算子「++」は、値の前に置くか(前置)後に置くか(後置)で意味が変わってきます。 ++を値の先頭に置くとその値に1を足した後に値を返します
逆に、値の後に置くとその値を返した後、1を加えます

先に「++」を書く場合を特に「前置インクリメント演算子」と呼び、 後に書く場合を特に「後置インクリメント演算子」と呼びます。

ん?どこがどう違うの?と思いますよね。以下の例を見てください。

var i;
var k=20;

i = k++;
System.inform("i="+i);
System.inform("k="+k);
				

実行結果は「i=20」「k=21」となりました。ここで、ちょっと頭を悩ませますよね。 一を足す動作をしているなら「i = k++;」の段階で変数iも21になっているはず。

ここが今回のポイントなんですね。 「++」を値の後に置くと「その値を返した後、1を加えます」と書いたとおり、 先に値を返してしまうので「k++」は「20」になってしまうのです。 もちろん、返した後はちゃんと1が足されています。これは「k=21」という結果で分かります。

このように、演算結果を代入したいのなら「i = k++;」は次のように書くべきです。

i = ++k;

上のプログラムをこのように書き換えて結果を確認してください。

後に++を書いた例 先に++を書いた例

次に「--」ですが、これは減算子またはデクリメント演算子と呼びます。 「++」とは逆に、値から1だけを引く時に使います。 「++」と同様に、先に「--」を書くと1を引いた値を返し、後に書くと先に値を返します。

先に「--」を書く場合を特に「前置デクリメント演算子」と呼び、 後に書く場合を特に「後置デクリメント演算子」と呼びます。

var i;
var k=20;

i = --k;
System.inform("i="+i);
System.inform("k="+k);
				

結果は実際に確認してみてください。