operator's side

26
Operator’s Side @第23回アルゴリズム勉強会 t_murano

Upload: takumi-murano

Post on 27-Jul-2015

112 views

Category:

Technology


2 download

TRANSCRIPT

Operator’s Side@第23回アルゴリズム勉強会

t_murano

演算子に着目しよう!

※都合によりJavaに限定

※注意事項

この発表を参考にした 可読性の悪いコードの生産に対しての

一切の責任を負いかねます

演算子とは?

!

“ In computer programming and at the command line, an operator is an object that is capable of manipulating a value or operator. ”

引用元 : http://www.computerhope.com/jargon/o/operator.htm

なぜ演算子なのか?

• ほぼ必ず使う要素

• 様々な演算子を知っていると簡潔に書けるかも

• よく知らずに使うと思わぬ挙動が…

演算子の種類• 算術演算子

• 比較演算子

• 論理演算子

• ビット演算子

• 代入演算子明確な定義があるわけではないけど だいたいこんな感じに分けられるはず

いくつかピックアップ

/ (除算)

• 左の値を右の値で割る演算子

突然ですが問題です次のうち浮動小数点型の値を返すのはどれ?

• 1 / 2

• 1.0 / 2

• 1 / 2.0

• 1.0 / 2.0

答え

除数 or 被除数が浮動小数点型のもの

• 1.0 / 2

• 1 / 2.0

• 1.0 / 2.0

またまた問題です次のうち例外(ArithmeticException)が発生するのはどれ?

• 0 / 0

• 1 / 0

• 0 / 0.0

• 1.0 / 0

答え

除数 and 被除数が整数型のもの (除数は0)

• 0 / 0

• 1 / 0

ちなみに

浮動小数点型には、NaN(非数)とInfinity(無限大)が用意されている

• 0 / 0.0 -> NaN

• 1.0 / 0 -> Infinity

++ --

• インクリメント, デクリメント

• 前置 ~ と、後置 ~ が存在

• for文とかでよく使いますよね

前置と後置を比較!

int a = 0; int b = a++; // b -> 0 !

Code: 0: iconst_0 1: istore_1 2: iload_1 3: iinc 1, 1 6: istore_2

!

int a = 0; int b = ++a; // b -> 1 !

Code: 0: iconst_0 1: istore_1 2: iinc 1, 1 5: iload_1 6: istore_2

単体で使う場合

int a = 0; !

a++; ++a; a += 1;

Code: 0: iconst_0 1: istore_1 2: iinc 1, 1 5: iinc 1, 1 8: iinc 1, 1

内部ではどれも一緒っぽい

論理演算子

• & (AND), | (OR), ^ (XOR), ! (NOT)

• &&, || (左から短絡評価)

• boolean型に使用

• & | ^ は整数型にも使用できる

短絡評価

• && は左の式の結果が false だったら右の式を評価しない

• || は左の式の結果が true だったら右の式を評価しない

短絡評価の利用

// array.length == 10 とする for (int i = 0; i < 20; i++) if (i < 10 && array[i] % 2 == 0) { /* 処理 */ } !

i が 10未満の場合のみ array[i] にアクセスする

int型での利用

• a が奇数かどうか評価

int a = 11; // 0b1011

if ((a & 1) == 1)

• LSBが1かどうか評価している

0b1011 AND ) 0b0001

0b0001

複合代入演算子

• 自己代入を行う演算子

• +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, |=, ^=

• a += 1; -> a = a + 1;

• b /= c - 2; -> b = b / (c - 2);

instanceof

• Javaの特殊な演算子

• オブジェクトが指定したクラスかどうか判定

• プリミティブ型は使用できない

• “foo“ instanceof String -> true

優先順位

• 四則計算のようにプログラミングの演算子にも優先順位がある

• 同じ優先度の演算子は左から順に評価

• 各自で調べてください (スライドに収めるのが面倒だった)

まとめ

• 演算子にも色々ある (多分Javaは少ない方)

• 同じ演算子でも型によって挙動が異なる

• 細かい仕様を理解して、正確にコードを読み書きしよう!

参考URL• Java演算子・式の評価 : http://www.ne.jp/asahi/hishidama/home/tech/java/expression.html

• Javaの道 > Java基本 : http://www.javaroad.jp/index_basic.htm

• バイトコード : http://www.ne.jp/asahi/hishidama/home/tech/java/bytecode.html

• Java入門 | Byte Code : http://msugai.fc2web.com/java/perform/byte.html