1. ブール演算

|and演算子&は数値だけでなくブール式にも適用できます。

ただし、すでにご存知のとおり、演算子には&&and があります|||なぜ の代わりにと||を使用するのでしょうか? これには何か意味があるのでしょうか?あるようです。時々。&&&

および論理演算子は||&&いわゆる遅延原則に従って左から右に実行されます。

(expression1) || (expression2) || (expression3)

expression1 が に等しい場合、 と をtrue評価する意味はありません。結果は関係ありません。expression2expression3true

したがって、式を評価するとき (左から右に評価されます)、 を取得するとすぐにtrue残りの式の評価はスキップされます。メソッド呼び出しが含まれている場合、expression2 これらのメソッドは呼び出されませんexpression3

論理演算子についても同様です&&

(expression1) && (expression2) && (expression3)

expression1が に等しい場合、と をfalse評価する意味はありません。結果は関係ありません。expression2expression3false

これは重要な事実であり、次のようなものを書くことができます。

String s = null;
if (s != null && s.length() > 0) {

上記の例では、最初の部分が の場合にのみ実行されるため、 NullPointerException が発生することはありませs.length()s! = nulltrue

sが に等しい場合null、演算子の左側の部分は&&でありfalse、ブール式全体の結果は なのでfalse、右側の部分 ( s.length() > 0) は評価されません。

以上のことを言います:

|演算子または演算子を使用する場合&遅延評価は行われません。各部分式は常に評価されます。



2. Javaにおける演算の優先順位

おそらく高校の数学の授業で覚えていると思いますが、乗算演算子は加算演算子よりも優先されます。かっこの優先順位はさらに高く、かっこ内の式が最初に評価され、次に乗算と除算、次に加算と減算が評価されます。

Java の演算子にも優先順位があります。違いは、a) オペランドの数がわずかに多いこと、b) 一部の演算子ではオペランドが左から右に評価されるのに対し、他の演算子では右から左に評価されることです。

すべての Java 演算子をまとめた表を次に示します。

カテゴリー オペレーター 連想的
接尾語 () [] . 左から右へ
単項 ++ -- ! ~ 右から左に
乗法 * / % 左から右へ
添加剤 + - 左から右へ
シフトする >> >>> << 左から右へ
関連した > >= < <= 左から右へ
平等 == != 左から右へ
ビットごとAND & 左から右へ
Exclusive OR(XOR) ^ 左から右へ
ビットごとOR | 左から右へ
論理的AND && 左から右へ
論理的OR || 左から右へ
条件付き ?: 右から左に
割り当て = += -= *= /= %= >>= <<= &= ^= |= 右から左に
コンマ , 左から右へ

一番上の行には、最も高い優先順位を持つ演算子が含まれます。括弧は()優先順位を明示的に設定するために使用されます。角括弧は、[]配列変数の特定のインデックスにある要素にアクセスするために使用されます。ドット演算子 ( .) は、オブジェクトまたはクラスへの参照を使用してフィールドおよびメソッドにアクセスするために使用されます。

テーブル内で演算子が下位にあるほど、その優先順位は低くなります。

式の中で複数の演算子を使用する場合は、怠惰にならずに括弧を追加してください。

Java では、 のようなものを書くことができますif (a & 1<< b > ~c)が、そうすべきではありません。コンパイラーだけでなく、他のプログラマーのためにもコードを作成することになります。コードは読みやすいほど良いです。



3. 接頭辞と接尾辞の増分

すでにご存知のとおり、Java にはインクリメント演算子 ( ++) とデクリメント演算子 ( --) があります。それぞれ、変数の値を だけ増加および減少させます1

おそらくご存知ないのは、これらの演算子には 2 つのタイプがあるということです。プレフィックス (演算子は変数の前に置かれます) とポストフィックス (演算子は変数の後に置かれます) です。また、2 種類の演算子の動作は少し異なります。

Java では、次のような式を書くことができます。

int a = 5;
int b = a++;

演算子が変数の後に表示され、その変数が式の一部である場合++(上記の例のように)、式では変数の現在の値が使用され、その後でのみ変数が だけ増加します1

つまり、次のようなことが起こります。

int a = 5;
int b = a;
a = a + 1;

つまり、 は、一見したところでは考えられるようなものではbありません。56

演算子が変数の前にあり、変数が式の一部である場合++、まずその値が増加し1、その後にのみその値が式で使用されます。

int a = 5;
int b = ++a;

上の例は、次の例と同じです。

int a = 5;
a = a + 1;
int b = a;

ここで、bは に等しくなります6

Java プログラマーが他の人も Java プログラマーであるかどうかを判断するために使用される例もあります。

int a = 5;
int b = ++a + ++a;

はい、それも書くことができます。

この例は問題なくコンパイルされ、次のようになります。

int a = 5;

a = a + 1;
int v1 = a;

a = a + 1;
int v2 = a;

int b = v1 + v2;

オペレーターにとっては--、すべてがまったく同じです。