こんにちは。ECF Techブログ
担当 Michiharu.Tです。
Javaプログラミング入門記事の第3章をお送りいたします。
第3章のテーマは「式と演算」です。
本連載の初回および章立ての一覧については下記のリンクから確認できます。
解説動画
2023/12/06 解説動画を掲載しました。
3-1 演算の基本
演算はコンピュータが行うことのできる計算の総称です。+、ー、×、÷の四則計算の他にも様々な処理を行なうことができます。
演算は、演算子とオペランドを組み合わせて式を作ることによって行います。下は足し算を行なう式の例です。
- 演算子は計算の種類を表す記号です。
- オペランド(operand) は計算に用いられる値です。
- 演算子によって使用するオペランドの数が異なります。
用語の紹介で少し難しい印象になりましたが、実際に使ってみると直感的でそれほど難しくはありません。次節から様々な演算子をご紹介します。
3-2 算術演算子
いわゆる+、ー、×、÷の演算子です。かけ算の記号が*
、わり算の記号が/
になる点に注意が必要です。プログラム例を示します。
プログラム例
public class Main{ public static void main(String[] args){ System.out.println(14 + 5);//たし算 System.out.println(14 - 5);//ひき算 System.out.println(14 * 5);//かけ算 System.out.println(14 / 5);//わり算(商) System.out.println(14 % 5);//わり算(あまり) } }
実行結果
19 9 70 2 4
解説
演算内容はコメントのとおりです。わり算については、14/5
は14÷5の商となり、14%5
は14÷5の余りとなる点がポイントです。また、演算子前後の空白は見やすさのために入れています。
3-2-1 演算子を組み合わせる
演算子を組み合わせることで、複雑な数式を作ったり、計算結果をそのまま代入することができます。プログラム例を示します。
プログラム例
public class Main { public static void main(String[] args) { //計算結果をそのまま変数aに代入 int a = 5 + 3 - 2; System.out.println(a); //さらにaを2倍する a = a * 2; System.out.println(a); } }
実行結果
6 12
解説
各行の処理を説明します。
5 + 3 - 2
の計算結果6
を変数aに代入しています。- 変数aを表示。
6
が表示されます。 a * 2
で変数aを2倍し、変数aに再度代入しています。6×2で12
が代入されます。- 変数aを表示。
12
が表示されます。
3-3 代入演算子
代入も代入演算子(=
)を用いた演算のひとつです。下のような変数への代入に用いられます。
int a; a = 5;
3-3-1 複合代入演算子
複合代入演算子は、演算と代入を同時に行う演算子です。ここでは算術演算と代入を同時に行う演算子をご紹介します。プログラム例を示します。
プログラム例
public class Main{ public static void main(String[] args){ int a = 7; //a = a + 5; と同じ意味 a += 5; System.out.println(a); } }
実行結果
12
解説
a += 5
はa = a + 5
と同じ意味なので、7+5
の結果が代入され、最後に12
が表示されます。
他の算術演算子も同様に、複合代入演算子が用意されています。
a -= 5; //a = a - 5; と同じ意味 a *= 5; //a = a * 5; と同じ意味 a /= 5; //a = a / 5; と同じ意味 a %= 5; //a = a % 5; と同じ意味
3-4 インクリメント演算子・デクリメント演算子
インクリメント演算子(++
)は変数の値を1加算し、デクリメント演算子(--
)は変数の値を1減算します。書き方の例を示します。
変数名++
書き方は上のように変数名に++
または--
をくっつけます。プログラム例を示します。
プログラム例
public class Main{ public static void main(String[] args){ int a = 8; a++;//1加算 System.out.println(a); a--;//1減算 System.out.println(a); } }
実行結果
9 8
解説
a++;
で変数aに1加算されます。変数aは8
→9
となります。a--;
で変数aから1減算されます。変数aは9
→8
となります。
インクリメント演算子・デクリメント演算子はオペランドが1つであることから、単項演算子とも言います。このような演算に使う値の個数を基準にした呼び方を下表にまとめます。
名称 | オペランドの数 | 演算子の一例 |
---|---|---|
単項演算子 | 1 | ++ 、-- |
二項演算子 | 2 | + 、>= 、= |
三項演算子 | 3 | ?: |
3-4-1 前置と後置
インクリメント演算子・デクリメント演算子は演算子を変数の前に書く「前置」と演算子を変数の後に書く「後置」で次のように動作が変わります。
動作 | 書き方例 | |
---|---|---|
前置 | 該当文を実行する前に1加算(減算) | ++a; ,--a; |
後置 | 該当文を実行後に1加算(減算) | a++; ,a--; |
プログラム例を示します。
プログラム例
public class Main{ public static void main(String[] args){ int a = 8; System.out.println(++a);//(1) System.out.println(a++);//(2) System.out.println(a);//(3) } }
実行結果
9 9 10
解説
- (1)部分は次の順で処理が行われます。
- 変数aを1加算する。
8
→9
- 変数aを表示。
9
が表示される。
- 変数aを1加算する。
- (2)部分は次の順で処理が行われます。
- 変数aを表示。
9
が表示される。 - 変数aを1加算する。
9
→10
- 変数aを表示。
- (3)部分で
10
が表示されます。
3-5 演算子の優先順位
複数の演算子を組み合わせて式を作る場合、演算子の優先順位が重要となります。優先順位の高い演算子ほど先に処理されます。主な演算子の優先順位は下表のとおりです。
* 、/ 、% |
+ 、- |
< 、> 、<= 、>= |
== 、!= |
?: |
= 、+= 、-= 、*= 、/= 、%= |
- 上の段から下の段に向かって、優先順位が低くなります。
- 同じ段に位置する演算子は優先順位が同じです。
また、()
を使って式を囲むことで、演算子の優先順位を変更することができます。プログラム例を示します。
プログラム例
public class Main{ public static void main(String[] args){ int a = 5 + 3 * 4;//(1) int b = (5 + 3) * 4;//(2) System.out.println(a); System.out.println(b); } }
実行結果
17 32
解説
- (1)の式
int a = 5 + 3 * 4
は次の順で処理されます。3 * 4
が計算され、12
となる。5 + 12
が計算され、17
となる。- 変数aに
17
が代入される。
- (2)の式
int b = (5 + 3) * 4
は次の順で処理されます。(5 + 3)
が計算され、8
となる。8 * 4
が計算され、32
となる。- 変数bに
32
が代入される。
このように、演算によって式の一部の値が置き換わることを「評価」と言います。(1)の式を例に、評価の様子を図にすると次のようになります。
一見するとごく普通のことに思えますが、複雑なプログラムを理解するうえでとても重要な概念となります。
3-6 評価と型
演算の評価結果にも型があります。評価結果の型を考える際のポイントは「サイズの大きなオペランドに合わせられる」です。いくつかの例を示します。
int a = 5 + 3.5;
この記述はコンパイルエラーとなります。5 + 3.5
の部分はint型とdouble型の計算となり、評価結果がサイズの大きいdouble型と判断されるためです。
System.out.println( 10 / 3 );
この文の実行結果は3
となります。10 / 3
はint型同士のわり算なので、評価結果はint型となります。10÷3の正確な計算結果は3.333333....
ですが、int型は小数を表現できないため小数点以下が切り捨てられ、結果的に商である3
となります。
System.out.println( 10 / 3.0 );
この文の実行結果は3.3333333333333335
となります。10 / 3.0
はint型とdouble型の計算となり、評価結果がdouble型となります。double型は小数が表現できる型なので、小数を使って可能な限り、実値に近い値が表示されます。
3-7 キャスト演算子
キャスト演算子を使うと、変数や式の結果の型を強制変換することができます。書き方は次のとおりです。
(型名)変換対象
プログラム例を示します。
プログラム例
public class Main{ public static void main(String[] args){ int a = (int)(8.5 + 3.2); System.out.println(a); } }
実行結果
11
解説
int a = (int)(8.5 + 3.2)
の部分は次の順番で処理されます。
8.5 + 3.2
が計算され、11.7
(double型)と評価される。11.7
を強制的にint型に変換する。小数部が切り捨てられ11
となる。- 変数aに
11
が代入される。
(int)(8.5 + 3.2)
の部分を()
をつけずに(int)8.5 + 3.2
としてしまうと、8.5
だけをint型に型変換してしまいます。その結果、int型の変数aにdouble型の結果を代入することになり、コンパイルエラーとなってしまいます。3-8 文字列の連結
+
の演算記号を用いることで、文字列同士や文字列と数値などを連結できます。
+
の両端のいずれかがString型である場合、+
は文字列の連結を行います。- 文字列連結による演算結果はString型と評価されます。
プログラム例を示します。
プログラム例
public class Main{ public static void main(String[] args){ System.out.println( 20 + "歳です" ); double pi = 3.14; System.out.println( "円周率は" + pi + "です" ); } }
実行結果
20歳です 円周率は3.14です
解説
20 + "歳です"
の部分について、"歳です"
がString型なので+
によって、文字列の連結が行われます。よって20歳です
という1つの文字列となります。"円周率は" + pi + "です"
についても同様です。
[PR]
Javaをもっと詳しく学びたい!という方には、下の書籍がおススメです!筆者も愛用しています。