English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
计算机最基本的用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以将运算符分为以下几组:
算术运算符
関係演算子
ビット演算子
論理演算子
代入演算子
其他运算符
算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。下表列出了所有的算术运算符。
表格中的示例假设整数变量A的值为10、変数Bの値は20:
演算子 | 説明 | 例 |
---|---|---|
+ | 加法 - 相加运算符两侧的值 | A + B 等于 30 |
- | 减法 - 左操作数减去右操作数 | A – B 等于 -10 |
* | 乘法 - 相乘操作符两侧的值 | A * B等于200 |
/ | 除法 - 左操作数除以右操作数 | B / A等于2 |
% | 取余 - 左操作数除以右操作数的余数 | B%A等于0 |
++ | 自增: 操作数的值增加1 | B++ 或 ++B 等于 21(具体区别请参见下文) |
-- | 自减: 操作数的值减少1 | B-- 或 --B 等于 19(具体区别请参见下文) |
以下简单的示例程序演示了算术运算符。将下面的 Java 程序复制并粘贴到 ArithmeticOperator.java 文件中,然后编译并运行此程序:
class ArithmeticOperator { public static void main(String[] args) { double number1 = 12.5、number2 = 3.5, result; //使用加法运算符 result = number1 + 数値2; System.out.println("number1 + 数値2 = \ + result); //使用减法运算符 result = number1 - 数値2; System.out.println("number1 - 数値2 = \ + result); //使用乘法运算符 result = number1 * 数値2; System.out.println("number1 * 数値2 = \ + result); //使用除法运算符 result = number1 / 数値2; System.out.println("number1 / 数値2 = \ + result); // 使用余数运算符 result = number1 %number2; System.out.println("number1 %number2 = \ + result); } }
以下の例のコンパイルおよび実行結果は以下の通りです:
数値1 + 数値2 = 16.0 数値1 - 数値2 = 9.0 数値1 * 数値2 = 43.75 数値1 / 数値2 = 3.5714285714285716 数値1 %number2 = 2.0
1、自増(++)自減(--)演算子これは特別な算術演算子であり、算術演算子では演算には二つの操作数が必要ですが、自増自減演算子は一つの操作数のみです。
public class selfAddMinus{ public static void main(String[] args){ int a = 3;//変数を定義します; int b = ++a;//自増演算 int c = 3; int d = --c;//自減演算 System.out.println("自増演算後の値は"+b); System.out.println("自減演算後の値は"+d); } }
実行結果は:
自増演算後の値は4 自減演算後の値は2
解説:
int b = ++a; 演算プロセスを分割して: a=a+1=4; b=a=4, 最終結果はb=4,a=4
int d = --c; 演算プロセスを分割して: c=c-1=2; d=c=2, 最終結果はd=2,c=2
2、前頭自増自減法(++a,--a): まず自増または自減演算を行い、その後演算子の評価を行います。
3、後続自増自減法(a++,a--): まず演算子の評価を行い、その後自増または自減演算を行います 例:
public class selfAddMinus{ public static void main(String[] args){ int a = 5;//変数を定義します; int b = 5; int x = 2*++a; int y = 2*b++; System.out.println("自増演算子接頭語演算後のa="+a+"x="+x); System.out.println("自増演算子接尾語演算後のb="+b+"y="+y); } }
実行結果は:
自増演算子接頭語演算後のa=6、x=12自増演算子接尾語演算後のb=6、y=10
以下はJavaがサポートする関係演算子です
テーブルの例示整数変数Aの値は10、変数Bの値は20:
演算子 | 説明 | 例 |
---|---|---|
== | 二つの操作数の値が等しいかどうかを確認し、その場合条件が真となります。 | (A == B) は偽です。 |
!= | 二つの操作数の値が等しいかどうかを確認し、値が等しくない場合条件が真となります。 | (A != B) は真です。 |
> | 左操作数の値が右操作数の値より大きいかを確認し、その場合条件が真となります。 | (A > B) は偽です。 |
< | 左操作数の値が右操作数の値より小さいかを確認し、その場合条件が真となります。 | (A < B) は真です。 |
>= | 左操作数の値が右操作数の値より大きいかまたは等しいかを確認し、その場合条件が真となります。 | (A >= B) は偽です。 |
<= | 左操作数の値が右操作数の値より小さいかまたは等しいかを確認し、その場合条件が真となります。 | (A <= B) は真です。 |
以下の簡単な例示プログラムは関係演算子を示しています。以下のJavaプログラムをコピーしてTest.javaファイルに貼り付けて保存し、コンパイルして実行してください:
Test.javaファイルのコード:
public class Test { public static void main(String[] args) { int a = 10; int b = 20; System.out.println("a == b = " + (a == b ) ); System.out.println("a != b = " + (a != b ) ); System.out.println("a > b = " + (a > b ) ); System.out.println("a < b = " + (a < b ) ); System.out.println("b >= a = " + (b >= a ) ); System.out.println("b <= a = " + (b <= a ) ); } }
以下の例のコンパイルおよび実行結果は以下の通りです:
a == b = false a != b = true a > b = false a < b = true b >= a = true b <= a = false
Javaはビット演算子を定義しており、整数型(int)、長整数型(long)、短整数型(short)、文字型(char)、バイト型(byte)などの型に適用されます。
ビット演算子はすべてのビットに作用し、ビット演算を行います。仮定しますa = 60、b = 13;それらの二進数形式の表示は以下の通りです:
A = 0011 1100 B = 0000 1101 ----------------- A&B = 0000 1100 A | B = 0011 1101 A ^ B = 0011 0001 ~A= 1100 0011
以下の表はビット演算子の基本的な演算を示しています。整数変数Aの値を以下のように仮定します: 60および変数Bの値は 13:
演算子 | 説明 | 例 |
---|---|---|
& | 対応するビットがすべて1、それでは結果は1、それ以外の場合は0 | (A&B),は12、即0000 1100 |
| | 対応するビットがすべて0であれば結果は0、それ以外の場合は 1 | (A | B)は61、即 0011 1101 |
^ | 対応するビットの値が同じであれば結果は0、異なる場合は1 | (A ^ B)は49、即 0011 0001 |
〜 | ビット反転演算子は操作数の各ビットを反転します。つまり0は1、10に変わります。 | (〜A)は-61、即1100 0011 |
<< | ビット左シフト演算子です。左操作数は右操作数で指定されたビット数にビット左シフトされます。 | A << 20、因為乗法演算子は加法演算子よりも高い優先度を持っているので、まず計算240、即 1111 0000 |
>> | ビット右シフト演算子です。左操作数は右操作数で指定されたビット数にビット右シフトされます。 | A >> 20、因為乗法演算子は加法演算子よりも高い優先度を持っているので、まず計算15即 1111 |
>>> | ビット右シフト補零演算子です。左操作数の値は右操作数で指定されたビット数に右にシフトされ、移動した空き位は0で埋められます。 | A>>>20、因為乗法演算子は加法演算子よりも高い優先度を持っているので、まず計算15即0000 1111 |
以下の簡単なサンプルプログラムはビット演算子を示しています。以下のJavaプログラムをコピーしてTest.javaファイルに貼り付け、保存してからコンパイルおよび実行してください:
public class Test { public static void main(String[] args) { int a = 60; /* 60 = 0011 1100 */ int b = 13; /* 13 = 0000 1101 */ int c = 0; c = a & b; /* 12 = 0000 1100 */ System.out.println("a & b = \ + c ); c = a | b; /* 61 = 0011 1101 */ System.out.println("a | b = \ + c ); c = a ^ b; /* 49 = 0011 0001 */ System.out.println("a ^ b = \ + c ); c = ~a; /*-61 = 1100 0011 */ System.out.println("~a = \ + c ); c = a << 2; /* 240 = 1111 0000 */ System.out.println("a << 2 = \ + c ); c = a >> 2; /* 15 = 1111 */ System.out.println("a >> 2 = \ + c ); c = a >>> 2; /* 15 = 0000 1111 */ System.out.println("a >>> 2 = \ + c ); } }
以下の例のコンパイルおよび実行結果は以下の通りです:
a & b = 12 a | b = 61 a ^ b = 49 ~a = -61 a << 2 = 240 a >> 2 = 15 a >>> 2 = 15
以下の表は論理演算子の基本的な演算を示し、布尔変数Aが真、変数Bが偽であると仮定しています。
演算子 | 説明 | 例 |
---|---|---|
&& | 論理と演算子と呼ばれ、両方の操作数が真である場合のみ条件が真となります。 | (A && B)が偽です。 |
|| | 論理或演算子と呼ばれ、どちらかがtrueの場合に条件が真となります。 | (A || || B)が真です。 |
! | 論理非演算子と呼ばれ、操作数の論理状態を反転します。条件がtrueの場合、論理非演算子はfalseを得ます。 | !(A && B)が真です。 |
以下の簡単なサンプルプログラムは論理演算子を示しています。以下のJavaプログラムをコピーしてTest.javaファイルに貼り付け、保存してからコンパイルおよび実行してください:
public class Test { public static void main(String[] args) { boolean a = true; boolean b = false; System.out.println("a && b = ") + (a&&b)); System.out.println("a || b = ") + (a||b) ); System.out.println("!(a && b) = ") + !(a && b)); } }
以下の例のコンパイルおよび実行結果は以下の通りです:
a && b = false a || b = true !(a && b) = true
論理演算子を使用する場合、両方の操作数がtrueである場合のみ結果がtrueとなりますが、最初の操作がfalseの場合、その結果は必ずfalseとなります。その時点で二つ目の操作は判断されません。
public class LuoJi{}} public static void main(String[] args){ int a = 5;//変数を定義します; boolean b = (a<4)&&(a++<10); System.out.println("短絡論理演算子を使用した結果は"+b); System.out.println("aの結果は"+a); } }
実行結果は:
短絡論理演算子を使用した結果がfalseです aの結果は5
解説:このプログラムは短絡論理演算子(&&)を使用しており、まずa<4 の結果がfalseの場合、bの結果は必ずfalseになるため、2番目の操作aは実行されません++<10 の判定により、aの値は 5。
以下はJava言語がサポートする代入演算子です:
演算子 | 説明 | 例 |
---|---|---|
= | シンプルな代入演算子、右操作数の値を左操作数に代入します | C = A + BはAを + Bの値がCに割り当てられます |
+ = | 加と代入演算子、左操作数と右操作数を加じて左操作数に代入します | C + がAに等価です + A |
- = | 減と代入演算子、左操作数と右操作数を減じて左操作数に代入します | C - がAに等価です - A |
* = | 乗と代入演算子、左操作数と右操作数を乗じて左操作数に代入します | C * がAに等価です * A |
/ = | 除と代入演算子、左操作数と右操作数を除して左操作数に代入します | C / がAと同じタイプの場合、C = Cに等価です / A |
(%)= | 取余と代入演算子、左操作数と右操作数を取余して左操作数に代入します | C%= AはC = C%Aに等价です |
<< = | 左シフト位代入演算子 | C << = 2C = C << 2 |
>> = | 右シフト位代入演算子 | C >> = 2C = C >> 2 |
&= | ビット単位かく代入演算子 | C&= 2C = C&2 |
^ = | ビット単位異やけ代入演算子 | C ^ = 2C = C ^ 2 |
| = | ビット単位やけ代入演算子 | C | = 2C = C | 2 |
以下の簡単なサンプルプログラムは、代入演算子を示しています。以下のJavaプログラムをコピーして AssignmentOperator.java ファイルとして保存し、コンパイルして実行してください:
class AssignmentOperator { public static void main(String[] args) { int number1、number2; //を5割り当てられます1 数値1 = 5; System.out.println(number1); //変数numberに2の値がnumberに割り当てられます1 数値2 = number1; System.out.println(number2); } }
以下の例のコンパイルおよび実行結果は以下の通りです:
5 5
条件演算子はまた三元演算子と呼ばれます。この演算子は3の操作数を1つ持ち、布尔表現の値を判断する必要があります。この演算子の主な役割は、どの値が変数に割り当てられるべきかを決定することです。
variable x = (expression) ? value if true : value if false
public class Test { public static void main(String[] args){ int a, b; a = 10; // aが 1 成立した場合、bを設定します。 20、それ以外の場合は 30 b = (a == 1)? 20: 30; System.out.println("bの値は: "); + b); // aが 10 成立した場合、bを設定します。 20、それ以外の場合は 30 b = (a == 10)? 20: 30; System.out.println("bの値は: "); + b); } }
以下の例のコンパイルおよび実行結果は以下の通りです:
bの値は: 30 bの値は: 20
この演算子はオブジェクトの例を操作し、特定のタイプ(クラスタイプまたはインターフェースタイプ)であるかどうかを確認するために使用されます。
instanceof演算子の使用方法は以下の通りです:
(Object reference variable) instanceof (class/interface type)
演算子の左側の変数が指すオブジェクトが、演算子の右側のクラスまたはインターフェース(class/interface)のオブジェクトがあれば、結果はtrueです。
以下に一例を示します:
String name = "James"; boolean result = name instanceof String; // nameはStringタイプであるため、trueを返します。
比較されるオブジェクトが右側のタイプと互換性がある場合、この演算子はまだtrueを返します。
以下の例を見てみましょう:
class Vehicle {} public class Car extends Vehicle { public static void main(String[] args){ Vehicle a = new Car(); boolean result = a instanceof Car; System.out.println(result); } }
以下の例のコンパイルおよび実行結果は以下の通りです:
true
複数の演算子が一つの式に現れた場合、どの順番で評価されるのでしょうか?これは演算子の優先順位の問題に該当します。複数の演算子を持つ式では、演算子の優先順位が異なることで最終的な結果に大きな違いが生じることもあります。
例えば、(1+3)+(3+2)*2、この式が加号が最も優先される場合の答えは 18、この式が加号が最も優先される場合の答えは 14。
、もし乗号が最も優先されるなら、答えは 7 + 3 * 2、それから13;ここでxは2、ではなく3 * 20、因為乗法演算子は加法演算子よりも高い優先度を持っているので、まず計算6、それから加えます7。
以下のテーブルには、最高優先度の演算子が上、最低優先度の演算子が下に示されています。
カテゴリー | 演算子 | 関連性 |
---|---|---|
後置 | () [] . (点操作子) | 左から右 |
一元的 | expr++ expr-- | 左から右 |
一元的 | ++expr --expr + - ~ ! | 右から左 |
乗法的 | * /% | 左から右 |
加法的 | + - | 左から右 |
シフト | >>> >>> << | 左から右 |
関係 | > >= < <= | 左から右 |
等しい | == != | 左から右 |
ビット別と | & | 左から右 |
ビット別排他または | ^ | 左から右 |
ビット別または | | | 左から右 |
論理と | && | 左から右 |
論理または | || | 左から右 |
条件 | ?: | 右から左 |
割り当て | = + = - = * = / =%= >> = << =&= ^ = | = | 右から左 |
カンマ | 、 | 左から右 |