演算子の種類
プログラムの中で計算などの処理を表現するために、演算子を使用します。次のような種類があります。
■ 算術演算子
値を計算します。
演算子 | 意味 | 使用例 |
---|---|---|
+ |
一方の数値を他方の数値に足す 文字列型の場合は文字列を連結する |
num1 + num2 |
- | 一方の数値を他方の数値から引く | num1 – num2 |
- | 数値の符号を反転させる | -num1 |
* | 一方の数値に他方の数値を掛ける | num1 * num2 |
/ | 一方の数値を他方の数値で割る | num1 / num2 |
% | 一方の数値を他方の数値で割った時の余りを求める | num1 % num2 |
++ | 1加算する(インクリメント) | num1++ |
-- | 1減算する(デクリメント) | num1-- |
<< | 数値のビット・パターンを左にシフトする | num1 << 1 |
>> | 数値のビット・パターンを右にシフトする | num1 >> 1 |
○ ファイル
次のようにファイルを作成してください。
ファイル名 | ArithmeticTest.java |
---|
○ プログラム
次のようにプログラムを入力してください。
ArithmeticTest.java
- import java.io.*;
- class ArithmeticTest{
- public static void main(String[] args){
- //変数の宣言をする
- int num1 = 10;
- int num2 = 3;
- //算術演算の結果を表示する
- System.out.printf("加算: %d¥n", num1 + num2);
- System.out.printf("減算: %d¥n", num1 - num2);
- System.out.printf("反転: %d¥n", -num1);
- System.out.printf("乗算: %d¥n", num1 * num2);
- System.out.printf("除算: %d¥n", num1 / num2);
- System.out.printf("剰余: %d¥n", num1 % num2);
- System.out.printf("インクリメント: %d¥n", num1++);
- System.out.printf("デクリメント: %d¥n", num1--);
- System.out.printf("左シフト: %d¥n", num1 << 1);
- System.out.printf("右シフト: %d¥n", num1 >> 1);
- }
- }
○ コンパイルと実行
C:¥work>javac ArithmeticTest.java
C:¥work>java ArithmeticTest
加算: 13
減算: 7
反転: -10
乗算: 30
除算: 3
剰余: 1
インクリメント: 10
デクリメント: 11
左シフト: 20
右シフト: 5
C:¥work>
○ 解説
6、7行目では、2つの変数を宣言しています。10~19行目では、算術演算をして結果を表示しています。今回はSystem.out.printf()を使っています。これは、()内の文字列を指定した書式で表示します。C言語のprintf関数と同じように使用できます。文字列の中に「%d」を指定して、そのあと「,」で整数値として埋め込むデータを指定します。
18行目は、変数のデータを2進数表現で左側に動かします。1つ動かすと、10進数で2倍しているのと同じことになります。2つ動かすと4倍、3つ動かすと8倍というように、1つ動かすごとに2の2乗倍することになります。19行目は、変数のデータを2進数表現で右側に動かします。1つ動かすと10進数で、2で割っているのと同じことになります。2つ動かすと4で割る、3つ動かすと8で割るというように、1つずつ動かすごとに2の2乗で割っていることになります。
■ 代入演算子
計算結果を代入します。
演算子 | 意味 | 使用例 |
---|---|---|
= | データを変数に代入する | num = 2 |
*= | 変数に格納されているデータと乗算し、その結果を変数に代入する | num *= 2 |
/= | 変数に格納されているデータと除算し、その結果を変数に代入する | num /= 2 |
%= | 変数に格納されているデータと除算し、その余りを変数に代入する | num %= 2 |
+= |
変数に格納されているデータと加算し、その結果を変数に代入する 文字列型の場合は文字列を連結し、その結果を変数に代入する |
num += 2 str += "2" |
-= | 変数に格納されているデータを減算し、その結果を変数に代入する | num -= 2 |
<<= | 変数に格納されているデータを左シフトし、その結果を変数に代入する | num <<= 2 |
>>= | 変数に格納されているデータを右シフトし、その結果を変数に代入する | num >>= 2 |
○ ファイル
次のようにファイルを作成してください。
ファイル名 | AssignmentTest.java |
---|
○ プログラム
次のようにプログラムを入力してください。
AssignmentTest.java
- import java.io.*;
- class AssignmentTest{
- public static void main(String[] args){
- //変数の宣言をする
- int num;
- //代入演算とその結果を表示する
- num = 10;
- System.out.printf("代入: %d¥n", num);
- num *= 2;
- System.out.printf("乗算: %d¥n", num);
- num /= 2;
- System.out.printf("除算: %d¥n", num);
- num %= 3;
- System.out.printf("剰余: %d¥n", num);
- num += 2;
- System.out.printf("加算: %d¥n", num);
- num -= 1;
- System.out.printf("減算: %d¥n", num);
- num %lt;%lt;= 1;
- System.out.printf("左シフト: %d¥n", num);
- num >>= 2;
- System.out.printf("右シフト: %d¥n", num);
- String str = "メロンが";
- str += "食べたい。";
- System.out.printf("文字列: %s¥n", str);
- }
- }
○ コンパイルと実行
C:¥work>javac AssignmentTest.java
C:¥work>java AssignmentTest
代入: 10
乗算: 20
除算: 10
剰余: 1
加算: 3
減算: 2
左シフト: 4
右シフト: 1
文字列: メロンが食べたい。
C:¥work>
○ 解説
9行目では、変数numに10を格納します。11行目では、先ほど格納した「10」に2を乗算して再び変数numに格納します。13行目では、先ほど格納した「20」を2で除算して変数numに格納します。15行目では、先ほど格納した「10」に3で除算した余りを変数numに格納します。17行目では、先ほど格納した「1」に2を加算して変数numに格納します。19行目では、先ほど格納した「3」を1で減算して変数numに格納します。21行目では、先ほど格納した「2」を左に1ビット分ずらして、変数numに格納します。23行目では、先ほど格納した「4」を右に2ビット分ずらして、変数numに格納します(格納される値は1)。
26行目では、変数strに文字列「メロンが」を格納しています。27行目では、変数strに格納されている「メロンが」に「食べたい。」を文字列結合して、再び変数strに格納します。
■ 比較演算子
条件を比較してbool値を算出します。
演算子 | 意味 | 使用例 |
---|---|---|
== | 2つのデータが等しいことを確認する | num1 == num2 |
!= | 2つのデータが等しくないことを確認する | num1 != num2 |
< | 一方のデータが他方のデータより小さいことを確認する | num1 < num2 |
> | 一方のデータが他方のデータより大きいことを確認する | num1 > num2 |
<= | 一方のデータが他方のデータ以下であることを確認する | num1 <= num2 |
>= | 一方のデータが他方のデータ以上であることを確認する | num1 >= num2 |
○ ファイル
次のようにファイルを作成してください。
ファイル名 | RelationalTest.java |
---|
○ プログラム
次のようにプログラムを入力してください。
RelationalTest.java
- import java.io.*;
- class RelationalTest{
- public static void main(String[] args){
- //変数の宣言をする
- int num1 = 10;
- int num2 = 5;
- //比較した結果を表示する
- System.out.printf("等しい: %b¥n", num1 == num2);
- System.out.printf("等しくない: %b¥n", num1 != num2);
- System.out.printf("より小さい: %b¥n", num1 < num2);
- System.out.printf("より大きい: %b¥n", num1 > num2);
- System.out.printf("以下: %b¥n", num1 <= num2);
- System.out.printf("以上: %b¥n", num1 >= num2);
- }
- }
○ コンパイルと実行
C:¥work>javac RelationalTest.java
C:¥work>java RelationalTest
等しい: false
等しくない: true
より小さい: false
より大きい: true
以下: false
以上: true
C:¥work>
○ 解説
10行目では、変数num1の値と変数num2の値が等しいかどうかを判断します。等しくないので「false」が出力されます。今回、printfで「%b」を指定していますが、これは「,」で区切ったデータをboolean型として埋め込みます。11行目では、変数num1の値と変数num2の値が等しくないかどうかを判断します。等しくないので「true」が出力されます。
12行目では、変数num1の値が変数num2の値がより小さいかどうかを判断します。小さくないので「false」が出力されます。13行目では、変数num1の値が変数num2の値より大きいかどうかを判断します。大きいので「true」が出力されます。
14行目では、変数num1の値が変数num2の値以下かどうかを判断します。以下ではないので「false」が出力されます。15行目では、変数num1の値が変数num2の値以上かどうかを判断します。以上なので「true」が出力されます。
■ 論理演算子
論理演算をしてbool値を算出します。
演算子 | 意味 | 使用例 |
---|---|---|
! | ブール値の論理否定を求める | !(num1 < num2) |
& | 2つのブール値の論理積を求める | num1 > 1 & num1 < 10 |
&& |
2つのブール値の論理積を求める(ショートサーキット) 必要な場合のみ2番目の論理演算を処理する |
num1 > 1 && num1 < 10 |
| | 2つのブール値の論理和を求める | num1 > 0 | num2 < 0 |
|| |
2つのブール値の論理和を求める(ショートサーキット) 必要な場合のみ2番目の論理演算を処理する |
num1 > 0 || num2 < 0 |
^ | 2つのブール値の排他的論理和を求める | num1 == 10 ^ num2 == 5 |
○ ファイル
次のようにファイルを作成してください。
ファイル名 | LogicalTest.java |
---|
○ プログラム
次のようにプログラムを入力してください。
LogicalTest.java
- import java.io.*;
- class LogicalTest{
- public static void main(String[] args){
- //変数の宣言をする
- int num1 = 10;
- int num2 = 5;
- //論理演算の結果を表示する
- System.out.printf("否定:%b¥n", !(num1 < num2));
- System.out.printf("論理積:%b¥n", (num1 > 0 & num1 < 10));
- System.out.printf("論理和:%b¥n", (num1 > 0 | num2 < 0));
- System.out.printf("排他的論理和:%b¥n", ((num1 == 10) ^ (num2 == 5)));
- System.out.printf("論理積(ショートサーキット):%b¥n", (num1 > 0 && num1 < 10));
- System.out.printf("論理和(ショートサーキット):%b¥n", (num1 > 0 || num2 < 0));
- }
- }
○ コンパイルと実行
C:¥work>jjavac LogicalTest.java
C:¥work>jjava LogicalTest
否定:true
論理積:false
論理和:true
排他的論理和:false
論理積(ショートサーキット):false
論理和(ショートサーキット):true
C:¥work>
○ 解説
10行目では、変数num1と変数num2を比較します。今回は「10 < 5」となるので条件としては「false」です。しかし、「!」が付いているので否定として扱われ、「falseではない」つまり「true」と出力されます。
11行目では、2つの条件判断の結果をもとに判断します。今回は「num1 > 0」で「true」、「num2 < 10」で「false」となります。この2つの判断の結果を「true & false」のようにさらに判断します。結果は「false」になります。論理積は次のような結果が出力されます。2つの条件が「true」の場合のみ「true」となります。
条件1 | 条件2 | 出力 |
---|---|---|
false | false | false |
false | true | false |
true | false | false |
true | true | true |
12行目では、2つの条件判断の結果をもとに判断します。今回は「num1 > 0」で「true」、「num2 < 0」で「false」となります。この2つの判断の結果を「true | false」のようにさらに判断します。結果は「true」になります。論理和は次のような結果が出力されます。2つの条件のうち少なくともどちらか一方が「true」であれば「true」になります。
条件1 | 条件2 | 出力 |
---|---|---|
false | false | false |
false | true | true |
true | false | true |
true | true | true |
13行目では、2つの条件判断の結果をもとに判断します。今回は「num1 == 10」で「true」、「num2 == 5」で「true」となります。この2つの判断の結果を「true ^ true」のようにさらに判断します。結果は「false」になります。排他的論理和は次のような結果が出力されます。2つの条件の結果が違えば「true」になります。
条件1 | 条件2 | 出力 |
---|---|---|
false | false | false |
false | true | true |
true | false | true |
true | true | false |
14、15行目では、他方の条件で全体が決まる場合は、もう一方の条件判断を省略します。結果として「&」と「|」それぞれの判断と同じになります。
■ 条件演算子(三項演算子)
論理演算をしてboolean値を算出し、2つの値のいずれかを返します。
演算子 | 意味 | 使用例 |
---|---|---|
?: | 論理演算を処理し、値を返す | (num1 < 0) ? "-" : "+" |
■ キャスト(型変換)
Javaは異なるデータ型の変数にデータを代入するときに型をチェックします。基本的には、サイズが大きいデータ型にサイズが小さいデータ型の値を代入することができます。しかし、データが失われる可能性のある代入は、通常の記述ではエラーになります。
例:
double d1 = 10.5;
int i1 = d1; ← エラーになる
データが失われる可能性のある代入は、次のように「キャスト」をすることで代入することができます。
例:
double d1 = 10.5;
int i1 = (int)d1;