算術計算 (Arithmetic)
算術演算の記号 (Arithmetic Operators)
主に、下記のような算術演算の記号が使用される。
記号 | 意味 | 備考 |
---|---|---|
+ | 加算 | 文字列を連結する演算にも使われる |
- | 減算 | |
* | 乗算 | |
/ | 除算 | 整数での計算は0への丸めが行われる |
% | 剰余 | 割った余り |
例を挙げると以下のような形である。
(1 + 2) * (3 + 4) / 5
この結果を表示させるには、次のように System.out.print や System.out.println を用いて出力すればよい。
System.out.println((1 + 2) * (3 + 4) / 5);
また、「-」は単体で用いることによって値の正と負を反転させることができる。
System.out.println( -(2 - 5) );
算術演算のデータ
算術演算のデータには整数と実数(小数点のついた数)がある。実数は正確には浮動小数点数(floating point number)と呼ばれるものであるが、ここでは分かり易さのため実数と呼んでおく。
- 整数の例
-
0, 1, 3, 563, -32, -1024
- 実数の例
-
1.0, 3.14, -73.5, 18., .5
この例のように実数には小数点がある。 x.0や0.xの0は省略することが出来る。
算術演算の結果
整数と整数の演算結果は整数である。実数と実数の演算結果は実数である。整数と実数、あるいは実数と整数の演算結果は実数である。
- 12 + 34 の結果は整数の46
- 7.0 / 3 の結果は実数の2.3333333333333335
整数の割り算
7/3の結果は2.333...という実数でなく、その小数部分を切り捨てた2という整数である (0に最も近い整数に丸められる)。すなわち7を3で割った商2が得られる。そのときの余り1は剰余演算で求められる。すなわち7%3の結果が1となる。
整数の値の範囲
整数演算の結果は正確に得られる。ただし、通常、整数として表現できる値は最小値-2^31 = -2147483648、最大値2^31-1 = 2147483647の範囲の値だけである。演算結果がその範囲を超えた場合は正確な値が得られない。(これは、この整数の値が32ビットで表現されているからである。1ビットは0か1かの2通りの値を持つ。2ビットあれば00、01、10、11の4通り(4=2^2)、nビットあれば2^n通り、32ビットあれば2^32通りの値を持つ。その約半分2^31通りをそれぞれ正負の値に割り当てている)。
実数の値の精度
実数演算の結果はいつも正確に求められるとは限らない。通常我々は数値を10進数の形で表現するが、計算機の内部では2進数の形で表現するので、もともと正確には入らない数もある。たとえば、10進数の0.1は2進数の形では無限小数になる。それを有限のビット数で表現するので誤差がある。普通の実数の精度は(10進の)16桁程度である。
算術演算の優先度 (Rules of Operator Precedence)
加算や減算より乗算、除算、剰余演算の方が優先度が高い。たとえば
1+2*3-4/2
は
1+(2*3)-(4/2)
のように乗算や除算のほうが先に実行される。また、一般に演算は左から右の順番に実行される。それらの実行順序を括弧をつけて示すと
((1+(2*3)) - (4/2))
となる。
基本的な関数と定数 (Basic Functions and Constants)
- 基本的な関数として、平方根sqrt、三角関数のsin、cos、tanなど、乱数random、べき乗pow、などがある。
- 基本的な定数として PI = 3.14159265358979323846、自然対数の底 E = 2.7182818284590452354がある。
これらを使うときは、これらの名前の前に「Math.」をつける。たとえば
Math.sqrt(2.0)
と書けば2の平方根の値が得られる。 Math.sqrtはMathというClassにあるsqrtというメソッドである。引数を2.0としてそのメソッドを実行すると、その引数の平方根の値が得られる。
Math.sin(Math.PI)
と書けばsin(π)の値が得られる。ただし、それが誤差を含んだ形で、ほぼ16桁の精度で得られる。
計算結果の表示
文字列を表示するのに使用した System.out.println(...) は、括弧内に計算式を書くことによって、その計算結果を表示することができる。
// 100 を表示 System.out.println(100);
// 0.5 を表示 System.out.println(.5);
// 100.5 を表示 System.out.println(100 + 0.5);
// 半径2.0の円の面積を表示 System.out.println(2.0 * 2.0 * Math.PI);
// 辺の長さが3.0の正方形の対角線の長さを表示 System.out.println(Math.sqrt(Math.pow(3.0, 2.0) + Math.pow(3.0, 2.0)));
// 1 から 10 までの総和を表示 System.out.println(1+2+3+4+5+6+7+8+9+10);
文字列に対する演算
計算結果と文字列を表示する際に、以下のように書くと少々読みにくくなる。
System.out.print("2.0の平方根は"); System.out.print(Math.sqrt(2.0)); System.out.println("である");
ここで、文字列は + 演算子を使用して連結させることができる。
System.out.println("2.0の平方根は" + Math.sqrt(2.0) + "である");
ただし、式と文字列を連結させるには注意が必要である。
System.out.println("3 + 4 + 5 の結果は" + 3 + 4 + 5 + "である");
これは、次のように解釈される。
System.out.println(((("3 + 4 + 5 の結果は" + 3) + 4) + 5) + "である");
つまり、"3 + 4 + 5 の結果は345である"と評価され、期待した結果と異なってしまう。そこで、明示的に括弧で括り(3 + 4 + 5)を先に計算させる。
System.out.println("3 + 4 + 5 の結果は" + (3 + 4 + 5) + "である");
変数 (Variables)
1 から 10 までの総和を計算し、それを5回表示するプログラムを書く場合、以下のように書くのは面倒である。
System.out.println(1+2+3+4+5+6+7+8+9+10); System.out.println(1+2+3+4+5+6+7+8+9+10); System.out.println(1+2+3+4+5+6+7+8+9+10); System.out.println(1+2+3+4+5+6+7+8+9+10); System.out.println(1+2+3+4+5+6+7+8+9+10);
コピーとペーストを組み合わせていけば簡単に思えるが、少しだけ表示させる値を変えたい場合、5箇所も変更をする必要がある。そこで、変数というものに計算の途中結果を入れておき、それを参照するようにする。
int sum = 1+2+3+4+5+6+7+8+9+10; System.out.println(sum); System.out.println(sum); System.out.println(sum); System.out.println(sum); System.out.println(sum);
ここでは、sumという変数に1から10までの総和を保存し、その内容を5回表示している。
以降では、変数について解説する。
変数と型 (Variables and Types)
変数は何かを入れておく箱のようなものである。それぞれの箱(変数)にはデータが入れられる。変数には名前をつけ、どんな種類(整数や実数など)のデータを入れる箱であるかを決めなければならない。たとえば、
int x;
と書くと、xという名前のついた変数(箱、計算機のメモリー上の場所)が作られ、その箱にはint 型の値を入れることが決まる。このintというのは integer (整数) の略で、xの箱に入れるデータの種類、つまり変数 x の 型 を整数型にするという宣言である。型には他にも double (実数) 型がある。この double は double-precision floating-point number (倍精度浮動小数点数) の略である。
int x; にあるxはint型の変数であるといわれる。これは、これ以降でint型の変数xを使うということを宣言していることになるので変数xの宣言と呼ばれ、この形全体「int x;」は宣言文と呼ばれる。1つの宣言文でいくつかの変数を宣言することが出来る。たとえば、
double a, b;
と書くと、実数を入れることのできるdouble型の変数aとdouble型の変数bを宣言したことになる。宣言文は一般に
型名 変数名, ... , 変数名;
の形である。いくつかの変数をまとめて宣言するときには、それらの間に「,」を入れなければならない。宣言文の最後は必ず「;」である。
型には様々なものがあるが、基本的には int (整数) 型や double (実数) 型を使用することになる。Javaで使用できる型のいくつかを以下に示す。
型 | サイズ | 特徴 |
---|---|---|
int | 32bit | 最もよく使われる整数型 (-2147483648~+2147483647) |
double | 64bit | 最もよく使われる実数型 |
byte | 8bit | 絶対値の小さな (-128~+127) 整数型 |
short | 16bit | 絶対値の小さな (-32768~+32767) 整数型 |
long | 64bit | 絶対値の大きな (-9223372036854775808~+9223372036854775807) 整数型 |
float | 32bit | 精度の低い実数型 |
char | 16bit | アルファベット、日本語を問わず1文字を表す |
boolean | 8bit | trueとfalseの2値のみを表現する型 |
変数の宣言 (Declaration)
int 型の変数 a を宣言するには以下のように書く。
int a;
末尾にセミコロンをつけること。
double 型の変数 b を宣言するには、以下のように書く。
double b;
こちらも末尾にセミコロンをつけること。
変数を宣言すると、その名前のついた変数をこれより下の行で使うことができる。逆に言えば、変数を使うには、先立って変数を宣言する必要がある。
複数の変数を同時に宣言する場合、同じ型のものならば同時に宣言できる。下記のようにカンマ「,」で区切って宣言する。
int c, d, e, f;
また、同じ名前の変数を重複して作成することはできない。
int a; int a; // ここでエラー
変数への代入 (Assignment)
変数には値を入れることが出来る。変数に値を入れることを変数に代入するという。たとえば、上記のように宣言された変数xには
x = 3;
として、整数の値3を代入することが出来る。
この記号「=」は等しいという意味ではなく、その右側(右辺)にある値を、その左側(左辺)にある変数に代入するという意味である。「代入」には「置き換える」という意味がある。上の例では、xの箱に入っていた値を3という値で置き換える。
右辺には、一般に式を書くことが出来る。その式の値が計算されて、その値が左辺の変数に代入される。たとえば、
x = 3 + 5 * 9;
では、48という値がxに代入される。
一般的な形は
変数名 = 式;
である。これは代入文(assignment statement)と呼ばれる。代入文の最後も必ず「;」である。
変数の参照 (Use)
代入文の右辺の式の中には変数名を書くことも出来る。その式の計算には、その計算のときにその変数に入っている値が使われる。たとえば、
double a, b; a = 3.0; b = a + 2.2; a = 5.0; a = a - 3.0;
のように代入文が並んでいると、各代入文は上から順に実行される(プログラムは一般に書いてある順に実行される)
最初の代入文でaには3.0が代入されるから、2番目の代入文では3.0+2.2の値がbに代入される。そのあとの代入文でaの値が5.0に変更されるから、最後の代入文では5.0-3.0の値がaに代入される。このように、代入文を実行することによって変数の値が変わっていく。たとえば、
x = x + 1;
は、そのときのxの値に1を加えたものをxに代入することになるので、xの値を1増やすことになる。
x = x + 1;
演算つき代入
大抵の算術演算子は、「=」の手前に書くことによって自分自身に演算を施し、その結果を代入するという意味になる。
// 変数 a に入っているデータを、それに 10 が加算されたデータに置き換える // a = a + 10; と同じ意味 a += 10;
// 変数 b に入っているデータを、それに 5 が減算されたデータに置き換える // b = b - 5; と同じ意味 b -= 5;
このうち、変数の中身を1だけ増減させるという演算はよく使用される。そこで、Javaやその他の多くの言語にはこれを簡単に行う仕組みが備わっている。
// 変数 a に入っているデータを、それに 1 が加算されたデータに置き換える // a = a + 1; と(ほとんど)同じ意味 a++;
// 変数 b に入っているデータを、それに 1 が減算されたデータに置き換える // b = b - 1; と(ほとんど)同じ意味 b--;
「a++」と「a += 1」は厳密には同じではないが、ここではとりあえず同じものとしてよい。
例を示すと、以下のような命令文の列が挙げられる。
int a; a = 100; a += 30; // a = a + 100 (aは130になる) a /= 13; // a = a / 13 (aは10になる) a--; // a = a - 1 (aは9になる) System.out.println("結果は" + a);
変数の宣言と初期化 (Declaration and Initialization)
変数を使う(たとえば代入文の左辺や右辺に書く)ときには、必ずその前のどこかにその変数の宣言がなければならない。変数を宣言すると同時に値を入れておくことも出来る。これは、変数に初期値(initial value)を入れる、あるは変数の初期化(initialization)をする、といわれる。たとえば、
int zero = 0;
と書けば、int型の変数zeroを宣言し、その初期値を0にすることになる。
これはつまり、以下の2行と同等である。
int zero; zero = 0;
変数の名前 (Identifier)
変数の名前やメソッドの名前などは、識別子(identifier)と呼ばれる。識別子はletter(後述)で始まり、そのあとにletterまたはdigit(数字)を幾つか並べたものである。たとえば、abc、b747、Abc、i503dなどを変数の名前として使うことが出来る。しかし、503d などは使えない。Javaでは大文字と小文字は区別するので、abcとAbcは違う名前とみなされる。Javaではclass名は大文字で始まり、それ以外の名前は小文字で始まるのが習慣のようになっている。letterとして一般に使われるのは英語のアルファベットであるが、「$」のような通貨記号や、「_」を使うことも出来る。また、Javaでは、漢字や仮名なども使うことが出来る。変数の名前は、それを見ただけで、そこに入れられる値の見当がつくような名前にするのがよい。ただし、ローカルな範囲で使われる名前は、1文字か2文字の簡単な名前でもよい。