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