!!! 第一章 Java プログラミングの基礎 !! 1-3. Javaプログラムの基礎 ! 演算子 Javaで扱われる演算子のうち、よく使うものを挙げておきます。 ■ '''算術演算子''' ,演算子,はたらき ,+,足し算 ,-,引き算 ,*,かけ算 ,/,割り算 ,%,剰余 '''表 3''' 算術演算子 上の四つは数学でいう四則演算を行うものです。注意が必要なのは、int 型での割り算です。数学では 7÷2 = 3.5 ですが、コンピュータに整数型で計算させると答えは3になります。小数部が切り捨てられるのです。 最後の剰余演算子は割り算の余りを求めるのに使うことができます。例えば数学(算数)では7÷4 = 1あまり3 です。これと同じように、コンピュータに整数型で計算させたとき、7%4 は 3 となります。 実際のプログラムで見てみましょう。 ''Sample06.java'' {{pre num public class Sample06{ public static void main( String[] args){ int a = 7; int x = 7 / 2; int y = 7 % 4; System.out.println( "x = " + x + ", y = " + y); } } }} このプログラムを実行すると、どのような出力が得られるか予想がつきますでしょうか。上の説明を読めばわかりますね。 C:\jprogram>java Sample06 x = 3, y = 3 本書で剰余演算子を使用することはありませんが、他のところでプログラムを読むときには出てくることがあるかもしれません。 ■ '''インクリメント・ディクリメント演算子''' インクリメント演算子(++)、ディクリメント演算子(--)は数を表す変数、または数を表す配列要素にのみ適用できる演算子です。 インクリメント演算子とディクリメント演算子は前置した場合 (++i) と後置した場合 (i++) で意味が異なります。例を挙げて説明します。次のプログラムソースを見て下さい。 ''Sample07.java'' {{pre num public class Sample07{ public static void main( String[] args){ int a = 100; int b = 100; int x = ++a * 10; int y = b++ * 10; System.out.println( "a = " + a + ", x = " + x); System.out.println( "b = " + b + ", y = " + y); } } }} Sample07の実行結果は次のようになります。 C:\jprogram>java Sample07 a = 101, x = 1010 b = 101, y = 1000 xの値とyの値の違いはどのようにして生じたのでしょうか。 Sample07.java をインクリメント演算子を用いずに書くと次のようになります。 ''Sample08.java'' {{pre num public class Sample08{ public static void main( String[] args){ int a = 100; int b = 100; a = a + 1; int x = a * 10; int y = b * 10; b = b + 1; System.out.println( "a = " + a + ", x = " + x); System.out.println( "b = " + b + ", y = " + y); } } }} これを見るとわかるように、前置と後置の違いは、足し算の評価が式の評価より先に行われるか、あとに行われるかということです。 ■ '''関係と比較の演算子''' ,演算子,はたらき ,>,より大きい ,>=,より大きいまたは等しい ,<,より小さい ,<=,より小さいまたは等しい ,==,等しい ,!=,等しくない '''表 4''' 関係と比較の演算子 関係と比較の演算子はbooleanの値、つまり真か偽かを返します。これらの演算子はとても良く使いますので覚えておいて下さい。 筆者は「より大きいまたは等しい」を表す演算子の記法が「>=」だったか「=>」だったかわからなくなることがよくありました。そんなときは英語で考えるとわかります。英語で「〜以上」を意味するのは greater equal です。要するに順番としては「より大きい」が先にきて、つづいて「(または)等しい」がくることになります。「以下」も less equal ですので <= となりますね。 ■ '''論理演算子''' ,演算子,はたらき ,&,論理積 (かつ) AND ,|,論理和 (または) OR ,^,排他的論理和 XOR ,!,論理否定 ,&&,ショートサーキット AND ,||,ショートサーキット OR '''表 5''' 論理演算子 この中でよく使うのは「ショートサーキット AND」 と「ショートサーキット OR」でしょう。プログラム例を示します。 ''Sample09.java'' {{pre num public class Sample09{ public static void main( String[] args){ int a = 10; int b = 5; // Short-circuit OR System.out.println( (a+b) < 10 || (a - b) < 10); // Short-circuit AND System.out.println( (a+b) < 10 && (a - b) < 10); } } }} 結果は次のようになります。 C:\jprogram>java Sample09 true false 6行目と10行目でショートサーキット演算子を使用しています。演算子「||」はまず左辺の条件式を評価 し、その結果が真であれば真を返します。左辺が偽の場合には右辺を評価し、右辺が真であれば真を、偽であれば偽を返します。また、演算子「&&」はまず左辺の条件式を評価し、その結果が真であれば右辺を評価します。右辺の条件式も真の場合には真を返します。それ以外の場合には偽を返します。 なんだかややこしいですか?表にまとめてみました。 ,左辺,右辺,| または || (OR),& または&& ,真,真,真,真 ,真,偽,真,偽 ,偽,真,真,偽 ,偽,偽,偽,偽 '''表 6''' 論理演算子 さきほど見たように、まず左辺を評価し、右辺が評価されるかどうかは左辺の結果次第です。一方、「&」や「|」は両辺の式が必ず評価されます。これは例えば次のようなプログラムを書いたときに差が出てきます。本書ではもっぱらショートサーキット演算子を使用します。 ''Sample10.java'' {{pre num public class Sample10{ public static void main( String[] args){ int i = 0; int j = 0; // 論理演算子 (右辺は評価される) System.out.println( i < 0 & ++i > 0); System.out.println( j >= 0 | ++j > 0); System.out.println( "i = " + i + ", j = " + j); // ショートサーキット演算子 (左辺によっては右辺は評価されない) i = 0; j = 0; System.out.println( i < 0 && ++i > 0); System.out.println( j >= 0 || ++j > 0); System.out.println( "i = " + i + ", j = " + j); } } }} 実行結果は次のようになります。予想できましたか? C:\jprogram>java Sample10 false true i = 1, j = 1 false true i = 0, j = 0 ■ '''その他の演算子''' Java にはいままでに紹介した演算子の他にもいろいろな演算子があります。しかし本書で理解している必要があるのは上述の演算子くらいです。より詳しく学びたい場合にはJavaの入門書にあたってみてください。