SJC-P対策 演算子(3)


文字列連結演算子について



javaの「+」演算子は数値に対する演算と、
文字列に対する連結演算が可能です。

文字列と文字列を連結するのに「+」を使えるのはもちろん、
文字列と数値の連結にも「+」を使えます。

string str = "hoge";

System.out.println(str + 10 + 15);


この演算の結果はどうなるのでしょうか?

  hoge1015




つまり演算子の優先順位としては、文字列連結演算子の方が上です。
文字列のオペランドと、数値のオペランドに対して「+」を使うと、
常に「+」は文字列連結演算子として実行されます。

ただし括弧をつけて計算すれば、当然ながら
演算する順序を変えることも出来ます。

string str = "hoge";

System.out.println(str + (10 + 15));

  hoge25




string型の変数に対して、文字列の最後尾に文字列を連結して、
記憶することもできます。
このやり方を知らないと、StringBuilderクラスを使う羽目に...

string str = "hogehoge";
str += 15 + 10;
System.out.println(str);

hogehoge25


「+=」は、加算代入演算子です。
演算子としての優先順位は、代入演算子と同じです。




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



前置きインクリメント・デクリメントは、
四則演算より先に実行される。

ファイナル変数はインクリメント、デクリメントできない。
実際の試験では、まずソースコードコンパイルできるか、
出来ないか調べて。それからソースコードの解析は入ると、
一つの問題に掛かる時間を短縮できます。

int x = 10;
final int y = 20;

System.out.println("integer :" + ++x + x++);
System.out.println("final integer :" + ++y); //コンパイルエラー





論理演算子



論理演算子(短絡)は次の二つ。
&&(AND),||(OR)

特徴としては、式の左側から評価して、式が真となれば
残りの条件式は評価しない。

int x = 10;
int y = 20;
if(x >= 10 || y <= 30) {} //この場合は、右側の式は評価されない



論理演算子(非短絡)は、論理積論理和排他的論理和の3つが使える。
非短絡の論理演算子は、ビット演算子としても使えるが、SJC-P5.0の試験では
出題されないので割愛する。

int a = 10;
int b = 20;
int c = 20;

if(a == b & b == c) {};  //論理積...結果は false
if(a == b | b == c) {};  //論理和...結果は true
if(a != b ^ b != c) {};  //排他的論理和...結果は true


論理積は2項の式を評価して、共に式の結果が真となれば
論理積の結果は真となる。

論理和は2項の式を評価して、共に式のどちらかが真となれば
論理和の結果は真となるが。

排他的論理和は2項の式を評価して、共に式の結果が同じでなければ
排他的論理和の結果は真となる。

論理演算子(短絡)と(非短絡)の違いは式の評価方法にある。
短絡の場合は、複数の条件式で結果が真・偽となれば残りの式は評価しないが、
非短絡の場合は、複数の条件式で結果が真・偽を確定しても、残る式を全て
評価する。

論理演算子(短絡)を使う方が、余計な条件式テストを省略できるので
結果的にはJVMのパフォーマンス向上につながる?かな?

int a = 1;
int b = 2;
int c = 3;
int d = a;
int e = c;

if(a == b || c == e || (a+b) != e);  //c == e以降は評価しない
if(a == (c-b) | (a+b+c) < (c+d+e) | a < d) // a == (c-b)以降も式を評価する