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

Operator's Side

Jul 27, 2015

Download

Technology

Takumi Murano
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Operator's Side

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

t_murano

Page 2: Operator's Side

演算子に着目しよう!

※都合によりJavaに限定

Page 3: Operator's Side

※注意事項

Page 4: Operator's Side

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

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

Page 5: Operator's Side

演算子とは?

!

“ 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

Page 6: Operator's Side

なぜ演算子なのか?

• ほぼ必ず使う要素

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

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

Page 7: Operator's Side

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

• 比較演算子

• 論理演算子

• ビット演算子

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

Page 8: Operator's Side

いくつかピックアップ

Page 9: Operator's Side

/ (除算)

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

Page 10: Operator's Side

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

• 1 / 2

• 1.0 / 2

• 1 / 2.0

• 1.0 / 2.0

Page 11: Operator's Side

答え

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

• 1.0 / 2

• 1 / 2.0

• 1.0 / 2.0

Page 12: Operator's Side

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

• 0 / 0

• 1 / 0

• 0 / 0.0

• 1.0 / 0

Page 13: Operator's Side

答え

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

• 0 / 0

• 1 / 0

Page 14: Operator's Side

ちなみに

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

• 0 / 0.0 -> NaN

• 1.0 / 0 -> Infinity

Page 15: Operator's Side

++ --

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

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

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

Page 16: Operator's Side

前置と後置を比較!

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

Page 17: Operator's Side

単体で使う場合

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

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

Page 18: Operator's Side

論理演算子

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

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

• boolean型に使用

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

Page 19: Operator's Side

短絡評価

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

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

Page 20: Operator's Side

短絡評価の利用

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

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

Page 21: Operator's Side

int型での利用

• a が奇数かどうか評価

int a = 11; // 0b1011

if ((a & 1) == 1)

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

0b1011 AND ) 0b0001

0b0001

Page 22: Operator's Side

複合代入演算子

• 自己代入を行う演算子

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

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

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

Page 23: Operator's Side

instanceof

• Javaの特殊な演算子

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

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

• “foo“ instanceof String -> true

Page 24: Operator's Side

優先順位

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

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

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

Page 25: Operator's Side

まとめ

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

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

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

Page 26: Operator's Side

参考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