1.4 計算
ステラが拗ねて、なにやら分厚い本を読んでいるあいだ……エルにずっと気になっていたことを聞いてみることにした。
「少し気になってたんだが、ステラは学生なんだよな? エルも学生だったのか? それって制服だよな?」
すると、エルは、「ああ、これね」と話し始めた。
「ステラは魔法学校の学生だけど、私は今年卒業したばかりよ。制服は、単に性能が良いから着てるだけね。これ、丈夫だし燃えにくいし」
「なるほど……魔法学校って、普通15歳で卒業なのか?」
「そういうわけじゃないわ。入学の最低年齢がその年で12歳になる人で、制度上、最低でも3年通わなきゃいけないから……最短でその年で15歳になる人が卒業ってだけ。ふつう5年以上かかるわ。まあ、私とステラは……自分で言うのもなんだけど、優秀だったから3年で済んだのよ」
「へえ……」
……って、ステラはまだ卒業してないんだよな?
「ステラは3年で済んだ……って……」
「あの子、単位も十分だし、卒業研究も突破したから、もう学校行く意味無いのよ。ただ、魔法の研究を自主的にやっているだけ」
単位に卒業研究……やっぱり前の世界でいう大学みたいなものか。3年制だけど、ふつう5年以上かかるような感じだろうか。そういえばアメリカの大学は卒業が難しく、4年制だけど4年で卒業する人は珍しいという話を聞いたことがあったな。
「学校に行かなくていいのに、学校に行っているのか……偉いな……」
と感心していると、
「偉くない……。学校だと、好きなことの、最新の研究内容……分かるから……」
と、ステラが口を挟んだ。どうやら復活したようだ。
「好きなこと……やっぱり魔法か?」
「うん……。でも、魔法の仕組みとか、作り方……組み方は、どこにもなかった……。だから、今はここが……私の魔法学校……」
なんだか魔法学校と同列に語られるのは、抵抗を感じるな……自分の中のイメージは一流大学なのだが……
「だから……早く、魔法の勉強、再開しよう……?」
ステラのせいで勉強を中断させたのでは……と言おうとしたが、俺の勘違いが原因だったのを思い出して、何も言わずに頷いた。
なにはともあれ、ステラは本当に魔法を組むことへの意欲がすごいな。とはいえ、図書館でのエルも割とグイグイ来てたな……。二人が意欲的なのか、この世界の人間が全員意欲的なのか……
「じゃあ、いよいよ計算をやってみようか。二人とも、四則演算……足す、引く、掛ける、割る、はそれぞれ分かるよな?」
そう聞くと、二人ともうなずいた。
「魔法の記号は、こういうのを使う」
と言いながら、メモをした。
足す +
引く -
掛ける *
割る /
余り %
「掛けるから下は、普段使っている『×』『÷』じゃないのね……って、余りって?」
「ああ、多分それは計算結果を見た方が早い」
エルの質問に答えながら、魔石にこう刻んだ。
public class Test {
public static void main(String[] args) {
int a = 7;
int b = 2;
}
}
「ここまではいいよな?」
「ええ。整数の変数を準備しただけよね」
「じゃあ、計算を書くが……printlnの中に直接計算を入れるぞ」
そう言い、先ほどのコードを完成させる。
public class Test {
public static void main(String[] args) {
int a = 7;
int b = 2;
System.out.println(a / b);
System.out.println(a % b);
}
}
ちなみに、『int c = a / b;』と新しい変数を用意して、その中に計算結果を入れ、printlnでcを表示させてもよかった。好みの問題だろう。
魔法を実行すると、こう表示された。
[
3
1
]
「なるほど……答えは小数にならないのね」
「小数を使いたいなら、前回紹介したdoubleを使わないとダメだな。こんな感じに……」
と喋りながら、{}の中身を、こう書き換える。
double a = 7;
double b = 2;
System.out.println(a / b);
魔法を実行すると、こう表示された。
[3.5]
「型をdoubleにしてやれば、答えも小数になる。あとは……計算順序とか、そのへんは全部現実の計算と同じだな」
「()も使えるの?」
「ああ。まあ、色々試してみろ」
「そうね……習うより慣れろ、って言うものね」
それから、エルとステラは、ひたすら自分で色々試していた。
エルは、色々な数字を計算していた。時々数字を0で割って「なんか変なメッセージ出たー」とか言って泣きつかれた。『0で割ってはいけない』という大原則が数学の世界にあるように、魔法の世界でも0で割ろうとしたらエラーが起きるんだよな。
あとは、printlnの引数に『7 + 2 * 2』とか『(7 + 2) * 2』とかを入れて、計算順序をちゃんと変えられるかを試していた。もちろん、それぞれ[11]、[18]と表示されていた。
ステラはというと、片方をint、片方をdoubleに変えて計算をしようとして、「魔法に怒られた……」とか呟きながら、魔石を俺のところに持ってきた。
魔石にはこう書かれていた。
public class Test {
public static void main(String[] args) {
int a = 2;
double b = 3;
int c = a * b;
System.out.println(c);
}
}
『int c = a * b』のところが下線で強調され、下にエラーメッセージが表示されていた。エラーをちゃんと表示させられるのか……魔法のエディタ、メモ帳くらいの気持ちで接していたが、なんか高性能だな。
「えーと……エラーには、なんて書いてある?」
「『型の不一致: double から int には変換できません』だって……変換、できないんだ……」
「ムリヤリ変換することもできるけどな。こうやって変数の前に(int)というように書くと、型を変換できるぞ」
int a = 2;
double b = 3;
int c = a * (int) b;
System.out.println(c);
俺がこう書き換えてから実行すると、エラーは発生せず、[6]が表示された。
「ちなみにこれは型変換とかキャストって呼ぶんだ。でも、ムリヤリ型を変えているから、例えばこうやると……」
int a = 2;
double b = 3.9;
int c = a * (int) b;
System.out.println(c);
また書き換えて実行する。今回もエラーは発生しなかったが、先ほどと同じく[6]が表示される。
「……『.9』の部分が、切り捨てられた……?」
「そういうこと。よく分かったね」
そういって、ステラの頭をなでる。
「また子供扱い……」
「ああ……ごめん……」
ステラは前の世界で一緒によく遊んであげた親戚の子に似ているんだよな。身体の大きさとか、遊んでいるときに駆け寄ってくる仕草とか。……あの子、元気かなあ。
と考え事をしていると、ステラがまた魔法を組んでいた。
int a = 2;
double b = 3.9;
double c = a * b;
System.out.println(c);
「こっちは……キャスト、いらないの……?」
「ああ。こういうときは、魔法が勝手にintをdoubleにキャストしてくれるんだ。別に小数点の切り捨てとか、そういう問題が起こらないからな」
「……そうなんだ……キャストが必要なのと、いらないの……覚えなきゃ……ダメ……?」
「うーん、別に覚えないで、魔法に怒られたらキャストをつけるようにすればいいんじゃないかな」
この世界の魔法のエディタがちゃんとエラーを出してくれるようなので、神経質になってキャストをつける必要があるかどうかを考える必要は無いだろう。
前の世界でも、コーディング中に出てくるエラー(このようなエラーをコンパイルエラーという)についてはエディタが指摘してくれたので、半ば適当にやっていた。そのせいでJavaの資格を取るときに苦労したのだが……
ちなみに、俺はエルとステラに質問されない時間には、charに数字を代入しても文字を表示できるかとか、ビット演算子などの他の演算子が使えるかとか、色々なことを試していた。ちゃんと全て使えるあたり、やはり前の世界のJavaと全く同じようだった。
しばらくして、二人が少し疲れて休んでいるころ。
「これで二人も、俺が最初にやったような計算の魔法、できるようになったな」
と呟いた。
インクリメント・デクリメントや、比較演算子・論理演算子など、今回紹介していない演算子はいくつかありますが、今後もっと説明して実践しやすい場面で説明します。
今回紹介しない上に、今後9割がた出てこないであろう演算子についてのお話
●代入演算子について
『a = a + 1』というのを、『a += 1』と省略して書くこともできます。
他にも『a -= 1』や『a *= 1』などが用意されています。
また、『a = b = c = 1』といったように、複数の変数に一気に代入することもできます……が、可読性が悪い(コードが読みにくい)のでやらないことが多いです。
●その他の演算子
ここでは説明しませんが、ビット演算子、シフト演算子というものもあります。
使用場面が限られるうえ、どう動くのかを理解するだけでもかなり難しいですが、学んで損はないでしょう。
(使用場面が限られるとはいえ、筆者は一回、バイナリデータ中のフラグの値を読み取る時に使いました。いま使用できなくても、こんな演算もできるんだ位の気持ちで見るといいかと思います)
説明は、以下のリンクをご参照ください。
ビット演算子 https://www.javadrive.jp/start/ope/index8.html
シフト演算子 https://www.javadrive.jp/start/ope/index9.html
(私とは無関係な方のサイトなので、問題があればリンク削除します)