Top > Java > 演算子


式と演算子

式の仕組み

通常、私たちの世界で「」と言えば、数式を意味し、"1+2" のような形式を思い浮かべます。 Java の「」の多くは、演算子:Operator と オペランド:Operand を組み合わせて構成されています。 例えば、先の "1+2" では "+" が演算子にあたり、"1" と "2" がオペランドにあたります。
また、"1+2" の計算を行うことを Java では「評価する」と言います。評価して得られた結果を、 式の値と言います。


式の値を出力する

先の標準入出力を使用して、式の値を出力することができます。 下記のようなコードを入力します。

例1
すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
 
-
|
-
|
!
!
class Sample1
{
    public static void main(String args[])
    {
        System.out.println("1 + 2 は" + (1 + 2) + "です");
    }
}

1 + 2は3です

このように、変数に一旦格納することなく式の値を表示することができます。 また、計算式は ( ) で囲っておいてください。


演算子の種類

Javaには、+演算子以外にもたくさんの演算子があります。 主な演算子の種類を 下記に紹介します。

演算子記号名前演算子記号名前
+加算(文字列連結)++インクリメント
-減算--デクリメント
*乗算>より大きい
/除算>=以上
%剰余<未満
+プラス(単項)<=以下
-マイナス(単項)==等価
\~補数(単項)!=非等価
&ビット論理積instanceof型比較
|ビット論理和!論理否定(単項)
^ビット排他的論理和&&論理積
<<左シフト||論理和
>>右シフト? :条件
>>>符号なし右シフトnewオブジェクト生成

以降、代表的な演算子について、例を交えて説明します。


文字列連結演算子

+演算子は加算だけでなく、文字列を結合する役割もあります。 既に例でも示してきましたが、

System.out.println("num1+num2は" + (num1+num2) + "です"); 

"..."でくくられた文字列をオペランドとした場合には、+演算子は''文字列を結合 する''働きを持ちます。このとき、オペランドのどちらかが数値などであった場合には、 その数値は文字列に変換されて連結されます。


インクリメント・デクリメント演算子

"++", "--" インクリメント・デクリメント演算子は、下記のように使用します。

a++; /* インクリメント */
b--; /* デクリメント */ 

インクリメントは、変数(オペランド)の値を1増やす演算のことです。 デクリメントとは、変数の値を1減らす演算のことです。 つまり、下記と等価であり、 結果は同じです。

a = a + 1;
b = b - 1; 

また、インクリメント・デクリメント演算子は、オペランドの前に置く場合と、 後ろに置く場合があり、 処理が異なります。例えば、

int a = 0;
b = a++; 

というような記述を行うと、b に 0 が代入された後、a の変数がインクリメントされます。 また、

int a = 0;
b = ++a; 

と書くと、a の変数がインクリメントされた後に b に値が代入されるため、 b には 1 が代入されます。


代入演算子

代入演算子は、遠陬に値を代入する際に使用していた「=」という記号のことです。 左辺の変数に右辺の値を代入する、という意味を持つ演算子です。 代入演算子は、「=」だけではなく、他の演算子を組み合わせたバリエーションもあります。

演算子記号名前
+=加算代入
-=減算代入
*=乗算代入
/=除算代入
%=剰算代入
&=論理積代入
|=論理和代入
^=排他的論理和代入
<<=左シフト代入
>>=右シフト代入
>>>=符号なし右シフト代入

上記のような代入演算子は、他の演算と代入を同時に行うことができます。 例えば、

a += b; 

と書くと、変数 a の値に b を加算し、その値を a に代入します。 つまり、

a = a + b; 

と書くのと等価です。 また、+ と = の間に、空白を入れて記述しなければなりません。


シフト演算子

「<<」「>>」「>>>」という記号で示した演算子を、シフト演算子と呼びます。 シフト演算子とは、数値を2進数で表した場合の桁を、左または右に指定数だけシフトする という演算のことです。 例えば、<< 演算子は左シフト演算子と呼ばれ、左辺を2進数で表記したときの値を、右辺で指定した 桁数分だけ左にずらし、はみ出した桁数だけ右から0を入れるという演算を行います。 「5」を2進数で表すと、

5 = 00000101 

で表せます。2ビット左シフトさせると、

  5 = 00000101
<<2
―――――――――――――――――
20 = 00010100 

となります。プログラムで書く場合は、

val = 5 << 2; 

また、左へ1ビットシフトすると元の数の2倍、右へ1ビットシフトすると元の数の 1/2倍になります。これは、10進数の数で考えると分かりやすいです。


演算子の優先順位

優先順位

通常、我々が行う計算にも乗除算から先に行う、といったように、Java の演算子にも優先順位が存在します。優先順位を変更するには () を使用します。 下記の表は、先の物が優先順位が高くなっています。

記号名称結合規則
()引数
[]配列アクセス
.メンバアクセス
++後置インクリメント
--後置デクリメント
!論理否定
~補数
+プラス
-マイナス
++前置インクリメント
--前置デクリメント
newオブジェクト生成
()キャスト
*乗算
/除算
%剰算
+加算
-減算
<<左シフト
>>右シフト
>>>符号無し右シフト
>より大きい
>=以上
<未満
<=以下
instanceof型比較
==等価
!=非等価
&ビット論理積
^ビット排他的論理和
|ビット論理和
&&論理積
||論理和
? :条件
=代入
代入演算子

また、後置デクリメントと論理否定、前置デクリメントとオブジェクト生成、 キャストと乗算、剰算と加算、減算と左シフト、符号無し右シフトとより大きい、 型比較と等価、非等価と論理演算子全ては同じ優先順位です。
ところで、同じレベルの演算子を使用した場合、結合規則に従って、左または右から計算されます。


型変換

例えば、double 型の変数の値を int 型の変数に代入するには、 型変換という処理を 行わなければなりません。

double dnum = 160.0;
int inum;

inum = dnum; 

と記述するだけでは、コンパイルできません。 型を変換することを明示的に書いておく必要があります。 このために、下記のような書式のキャスト演算子を使用します。

(型名) 式 

キャスト演算子は、指定した式の型を、() 内で指定した型に変換するという 演算を行います。先の例では、

double dnum = 160.0;
int inum;

inum = (int)dnum; 

と書くことで、コンパイルできるようになります。 また、小数型の変数の値を整数型の変数に代入した場合、切り捨てられた整数となります。 小数から整数型へ変換する場合や、大きなサイズの型から小さなサイズの型へ変換する場合、 注意が必要です。


リロード   凍結解除 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Mon, 03 Jun 2019 14:37:49 UTC (1652d)