前回はUnityでの変数について解説しました。今回は変数を使って演算を行ってみたいと思います。
↑の動画でも解説していますので、文章ではわかりづらい、よくわからないという方はぜひご活用ください。
この記事は本のように順を追って解説しています。この記事は途中のページになります。
この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。
<基本的な演算をやってみよう>
さて、プログラムで様々な計算を行えるようにしておくと便利です。
計算と言われると難しい感じがしますが、簡単なのでやってみましょう。
四則演算と余り算
さて、では足し算とか掛け算とかそういうやつをまずは覚えましょう。
これらの基本的な計算は
・足し算 : a = 1 + 1;
・引き算 : a = 1 – 1;
・掛け算 : a = 1 * 1;
・割り算 : a = 1 / 1;
・余り算 : a = 1 % 1; (1割る1の余りは0なのでa=0)
と表されます。
この時「+」「-」「*」「/」「%」の事を算術演算子と言います。
まぁ、難しい感じで言ってますが、簡単ですね。
ちなみに、C#で「=」は「等しい」という意味ではなく「代入する」という意味になります。
例えば
int a = 1;
a = a + 1;
という不思議な式が成り立ちます。
数学ではa=a+1なんて式は成り立たないのですが、C#ではaにa+1を代入するという意味なので、aには2が入ります。
等しさを表すには
等しいかどうかというのは「==」で表します。
ただしプログラムの世界では「等しいという事実」があっただけではコンピュータはどうしていいかわからないので(事実ではなく命令が必要)
int a == 1;
と書いてもエラーになります。等しいかったら○○をするというような書き方をする必要があります。
この解説についてはまた次の機会にしたいと思います。
逆に「等しくない」を表す場合は「!=」を使用します。
「==」「!=」の事を等値演算子と言います。
まぁ、またこれも使用するときに解説しようと思います。
省略できる計算式がある
ある特定の計算式は省略して書く事ができます。
例えば
a = a + 1;
の場合
a += 1;
と省略することができます。
このように代入時に自分と同じ変数を使う際は「記号=」で省略することが可能です。
「-=」とか「*=」とか「/=」とか「%=」とかもできます。
プログラムの世界では何かと省略しようと頑張っているみたいです、
インクリメント・デクリメント
1足すだけとか1引くだけなら更に省略することができます。
a = a + 1;
は
++a;
と書いても同じ意味になります。
a = a - 1;
は
--a;
と同じ意味になります。
ちなみに1で掛けようが割ろうが余ろうが結果が変わらないので「**」とかはありません。
//だったらコメントになっちゃうし
この++をインクリメント、–をデクリメントと言います。
インクリメントとデクリメントは変数の後に書く事もできます。
a++;
a--;
こんな感じです。
変数の前に書くか後に書くかでちょっと意味が違うので気をつけてください。
int a = 0;
int b = ++a;
と書いた場合bは1になります。
int a = 0;
int b = a++;
と書いた場合bは0になります。
これは、++aは演算を先に行うと言う意味で、a++は演算以外の処理を先に行ってから演算を行うと言う意味になります。
そのため、a++と書くとプラス1される前にbに代入されてしまうので、aは1になってますが、bは0になるのです。
<小数点以下の計算>
整数型のintに少数を入れた場合
さて、ここで少し疑問に思った人もいると思います。
intは整数型の箱だけど、少数以下を入れたらどうなんの?って話です。
結果は切り捨てになります。
前回、変数は箱みたいなものだよ。そして箱には形があって大きさがあるよ!と解説しました。
整数型の箱の中に少数は入らないのです。
int a = 1 / 2;
と書いた場合、a は 0になります。
小数点は切り捨てなので0.5は0になります。
じゃぁ、小数点以下が欲しい時はどうすればいいのって話になるんですが、ちゃんと小数点以下が入る箱があります。
といっても、小数点以下が入る箱の種類というのはたくさんあるので、一番よく使われる型を紹介します。
float型です。
このfloat型は少数が入る型の中で大きさが最小です。
そのため、メモリに優しくそのため少数を使用する場合に一番よく使います。
計算時の注意点!
さて、float型に少数が入れられる事はわかりました。では
float a = 1 / 2;
とした場合どうなるでしょうか?
結果、a は 0になります。
ん?0?0.5じゃないの?って話なんですが、これにはワケがあります。
実はC#というのは暗黙的に型変換というのを行なっていて、箱の形を自動で判断して計算してくれています。つまり↑の式では
float a ← これは小数点以下が入る箱
1 ← これは整数
2 ← これは整数
1 / 2 は整数同士の計算ですので自動でint型として判断されます。
ようは
float a = (int)1/ (int) 2;
という感じになっています。
「(型名)変数か値」と宣言する事で類似する型は変換されます。これをキャストと言います。C#が自動でキャストしてくれているわけです。
1/2をした際に切り捨てられて0になった後、float型に代入されたという形になります。
そのため、float a = 1 / 2; は0になります。
サフィックス
ではfloat型の少数を扱うにはどうすればいいかといいますと、最後にfをつけます。
float a = 1f / 2f;
と書きます。
最後にfとつけることで、これはfloat型ですよと明示することができます。
これで、aは0.5になります。
このように数字を扱う型の場合、数字の最後に型の頭文字を書くことでその数字の型を表す奴のことをサフィックスといいます。
ちなみに
float a = 0.5 / 0.1;
と書くと今度はエラーになります。これは箱の種類が違うからですね。
少数の後に何もサフィックスをつけないとdouble型という奴で扱われます。
整数の後に何もつけないとint型、少数の後に何もつけないとdouble型になります。
floatという箱に入れようとしているのに、実際に入る数値がdouble型だから違うぜ?と言っているわけですね。
float a = 0.5f / 0.1f;
が正解です
double型かfloat型か
サフィックスなんてつけるくらいならdouble型でよくね?って話なんですが、なぜfloat型の方がよく使われるかというと、float型よりdouble型の方がデカいからです。
float型の有効桁数は7桁です。一方double型の有効桁数は16桁です。
一応float型は3.4×(10の-38乗)から3.4×(10の38乗)まで表現できますが、○○○E+△△みたいな指数表現になる上に○○は7桁までです。double型は1.7×(10の-308乗)から1.7×(10の308乗)まで表現できます。
このように表すことができる桁が違います。何故このような違いが起きるかといいますと、コンピュータのメモリ領域や計算速度が限られるからです。
前回箱には大きさがあると解説しましたね。その事です。
メモリは無限ではないので、小数点以下無限桁数持つわけにはいかないのです。また、CPUの処理能力も限られるので無限桁数の計算などできません。そのため、型によってどれぐらいまでの桁数計算できるかあらかじめ決めておいて、その分だけのメモリを確保しようというわけです。
そのため、float型の方が表せる桁数が少ないですが、double型より小さく、メモリ効率がよく使いやすいのでfloat型の方がよく使われるということです。
7桁以上の桁数を使う場面というのはそこそこ限られていますからね。もちろん桁数が必要な時はdouble型を使用した方がいいです。7桁目まで計算しているとはいえ、あぶれた桁数は切り捨てられているので計算に誤差が生じる場合があります。その点で言うとdouble型の方が計算精度が高いです。
ちなみに
float a = 0.5 / 0.1;
がエラーだったのは小さい箱にデカい中身をぶち込もうとしたのでエラーだったわけです。
逆だとC#が自動で変換してくれます。
double a = 0.5f / 0.1f;
だった場合はエラーになりません。大きい箱に小さいデータを入れようとしているからです。(小さい値ではありませんよ。小さいデータです。有効桁数です。)
ただし、int型の時みたいにfloat型が持ってない桁は切り捨てられますが。
<まとめ>
さて、基本的な計算についてやってみましたがいかがだったでしょうか?
計算する際には型の大きさについて注意してくださいね。
次回もプログラムの解説は続きますのでよろしくお願いします。