- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

自分の担当範囲でないので、6.6までとばします(マンドクセ('A`)

6.6算術演算子 Edit

二項演算子として、+(和)、-(差)、*(積)、/(商)、%(乗除、あまりね)がある。
二項演算子とは、 a + b というような、二項をとる演算子のこと。

単項演算子も、+と-が存在する。
単項演算子とは、+ aとか、- aと行ったようなひとつの項をとる演算子のこと。

6.6.1 整数算術 Edit

整数算術はオーバーフローやアンダーフローなく、丸められる。

例:

1
2
3
4
5
6
7
8
9
public class IntArithmetic {
    public static void main(String[] args) {
        System.out.println("Integer.MAX_VALUE = " + Integer.MAX_VALUE);
        System.out.println("Integer.MAX_VALUE + 1 = " + (Integer.MAX_VALUE + 1));
        
        System.out.println("Integer.MIN_VALUE = " + Integer.MIN_VALUE);
        System.out.println("Integer.MIN_VALUE - 1 = " + (Integer.MIN_VALUE - 1));
    }
}

結果

Integer.MAX_VALUE = 2147483647
Integer.MAX_VALUE + 1 = -2147483648
Integer.MIN_VALUE = -2147483648
Integer.MIN_VALUE - 1 = 2147483647

整数除算は、0に近い値に切り捨てされる。
0で割るとArithmeticException(算術例外)例外が起きる。

例:

1
2
3
4
5
6
7
public class IntArithmetic {
    public static void main(String[] args) {
        System.out.println("12 / 5 = " + (12 / 5));
        System.out.println("-12 / 5 = " + (-12 / 5));
        System.out.println("12 / 0 = " + (-12 / 0));
    }
}

出力結果:

12 / 5 = 2
-12 / 5 = -2
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at IntArithmetic.main(IntArithmetic.java:5)

文字に対する算術は、intに変換して行われる。
文字列じゃなくて、文字だという点に注意。

6.6.2 浮動小数点算術 Edit

浮動小数点算術は、無限大へオーバーフローしたりアンダーフローする。
無限大を無限大で割るような不正な結果の場合は、NaNになる。

有限値の算術は、doubleやfloatの精度の範囲で行われる。

浮動小数点演算の乗除算は、例外をスローされることはない。

その他のいろいろな算術の組み合わせはP157の表の通り。

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class IntArithmetic {
    public static void main(String[] args) {
        System.out.println("Double.MAX_VALUE = " + Double.MAX_VALUE);
        System.out.println("Double.MAX_VALUE * 2 = " + (Double.MAX_VALUE * 2));
        
        System.out.println("Double.MIN_VALUE = " + Double.MIN_VALUE);
        System.out.println("Double.MIN_VALUE * 2 = " + (Double.MIN_VALUE * 2));
        
        System.out.println("∞ = " + Double.POSITIVE_INFINITY);
        System.out.println("∞ + 1 = " + (Double.POSITIVE_INFINITY + 1));
        System.out.println("-∞ + 1 = " + (Double.NEGATIVE_INFINITY + 1));
        System.out.println("∞ / ∞ = " + (Double.POSITIVE_INFINITY / Double.POSITIVE_INFINITY));       
        System.out.println("∞ + ∞ = " + (Double.POSITIVE_INFINITY + Double.POSITIVE_INFINITY));
        System.out.println("∞ + -∞ = " + (Double.POSITIVE_INFINITY + Double.NEGATIVE_INFINITY));
        System.out.println("∞ - -∞ = " + (Double.POSITIVE_INFINITY - Double.NEGATIVE_INFINITY));
        System.out.println("∞ * 0 = " + (Double.POSITIVE_INFINITY * 0));

        System.out.println("NaN + 1 = " + (Double.NaN + 1));
        System.out.println("NaN + Double.POSITIVE_INFINITY = " + (Double.NaN + Double.POSITIVE_INFINITY));

        System.out.println("0f == -0f = " + (0f == -0f));
        System.out.println("1f / 0f = " + (1f / 0f));
        System.out.println("-1f / 0f = " + (-1f / 0f));
        System.out.println("1f / -0f = " + (1f / -0f));       
    }
}

結果:

Double.MAX_VALUE = 1.7976931348623157E308
Double.MAX_VALUE * 2 = Infinity
Double.MIN_VALUE = 4.9E-324
Double.MIN_VALUE * 2 = 1.0E-323
∞ = Infinity
∞ + 1 = Infinity
-∞ + 1 = -Infinity
∞ / ∞ = NaN
∞ + ∞ = Infinity
∞ + -∞ = NaN
∞ - -∞ = Infinity
∞ * 0 = NaN
NaN + 1 = NaN
NaN + Double.POSITIVE_INFINITY = NaN
0f == -0f = true
-0f < 0 = false
1f / 0f = Infinity
-1f / 0f = -Infinity
1f / -0f = -Infinity

6.6.3 Strictと非Strictの浮動小数点算術 Edit

浮動小数点算術には、strictと非strictの2つのモードがある。

strictだと、全Java仮想マシン上で同じ結果が得られる。
非strictだと、異なる結果が得られる可能性があり、速い可能性がある。

strictかどうかの厳密性は、strictfp修飾子によって決定される。

定数式の場合は、常に厳密に評価される。

6.7 一般の演算子 Edit

算術演算子のほかに、いろいろな演算子がある

6.7.1 インクリメントおよびデクリメント演算子 Edit

++は、インクリメント演算子、--は、デクリメント演算子。

前置と後置がある。
前置は、式の値が返される前に適用される。
後置は、式の値が返された後に適用される。

6.7.2 関係演算子と等価演算子 Edit

>、>=、<、<=、==、!=いったような
いくつかの関係演算子、等価演算子を提供する。
全て結果がbooleanとなる。

浮動小数点の場合、片方がNaNの場合、falseを返す。ただし、!=はtrueを返す。
値がNaNかどうかの検査は、Float.isNaN(float)、Double.isNaN(double)を使用する。

boolean値に対しては、==と!=が許されている。

等価演算子は、参照型にも適用できる。
しかし、等価演算子は、参照の同一性は検査できるが、オブジェクトの同値性は検査できない。
オブジェクトの同値性を検査する場合、equalsを使用すべき。

6.7.3 論理演算子 Edit

&、|、^、!、&&、||といったような論理演算子はブール値に適用され、ブール値を作り出す。

&は論理積(and)、|は論理和(or)、^は排他的論理和(xor)。
!はブール値を反転させる。

&&は条件積演算子、||は条件和演算子で、
左辺の値によって、式の値が決まる場合、右辺は評価されない。

6.7.4 instanceof Edit

instanceofは、オブジェクトのクラスの検査に使う。前にやった。

例:

if (hoge instanceof Hoge)
  :

6.7.5 ビット操作演算子 Edit

&ビット積(and)、|ビット和(or)、^排他的ビット和(xor)がビット演算子としてある。
整数に適用される。

ビット操作演算子の他には、<<左シフト、>>右算術シフト、>>>右論理シフトがある。
右算術シフトは、符号を変更しない。
右論理シフトは、上位ビットは必ず0になる。

シフト演算子は、整数型のみに適用される。

6.7.6 条件演算子 ? Edit

条件演算子?は、2つの値から1つの値をブール値に基づいて返す演算子。
クエスチョン/コロン演算子とも呼ばれ、Java唯一の三項演算子。
C言語でおなじみ。

hoge = true ? x : y

は、hogeは、xを返す。

hoge = false ? x : y

は、hogeは、yを返す。

6.7.7 代入演算子 Edit

左辺に右辺を代入する。

式自体は、評価された値を持つため、x = y = 0;といったような、一度に複数の代入ができる。これは、Cでおなじみ。Pascalは値を持たないので、できないっす。

算術演算子、論理演算子、ビット演算子は代入演算子と結合して、複合代入演算子となる。
例としては、*=とか|=とかある。

6.7.8 文字列結合演算子 Edit

2つの文字列を結合するのに+が利用できる。
+演算子は片方が文字列なら、文字列結合として認識され、もう片方は文字列に変換される。

6.7.9 new Edit

new は、インスタンス生成式と呼ばれる。
例:

Hoge hoge = new Hoge();



Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2005-10-25 Tue 18:38:13 JST (5206d)