1. Boole işlemleri

|ve işleçleri &yalnızca sayılara değil aynı zamanda mantıksal ifadelere de uygulanabilir.

&&Ancak, zaten bildiğiniz gibi, ve operatörleri var ||. |Neden yerine ||ve &yerine kullanırız &&? Bunun bir anlamı var mı? Görünüşe göre var. Bazen.

ve mantıksal işleçler , tembel bir ilke izlenerek soldan sağa doğru yürütülür ||.&&

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

Eğer expression1 eşit ise true, değerlendirmenin bir anlamı yoktur expression2 ve expression3: sonuç truene olursa olsun olacaktır.

Buna göre ifadeleri değerlendirirken (soldan sağa doğru değerlendirilirler) alır almaz truegeri kalan ifadelerin değerlendirilmesi atlanır . Ve eğer expression2 ve expression3metod çağrılarını içeriyorsa, bu metotlar çağrılmayacaktır !

Aynı &&mantıksal operatör için de geçerli:

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

Eğer expression1eşit ise false, değerlendirmenin bir anlamı yoktur expression2ve expression3: sonuç falsene olursa olsun olacaktır.

Bu, aşağıdaki gibi şeyler yazmanıza izin veren önemli bir gerçektir:

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

Yukarıdaki örnek size asla bir NullPointerException sağlamaz , çünkü yalnızca ilk kısım ise s.length()yürütülür .s! = nulltrue

seşittir ise , operatörün nullsolundaki kısım , o zaman tüm boole ifadesinin sonucu , yani sağdaki kısım ( ) değerlendirilmez.&&falsefalses.length() > 0

Söylenecek her şey:

|İşleci veya işleci kullanırsanız &, tembel değerlendirme yoktur : her alt ifade her zaman değerlendirilir.



2. Java'da işlem önceliği

Muhtemelen lise matematik dersinizden hatırladığınız gibi, çarpma işleci toplama işlecinden daha yüksek önceliğe sahiptir. Parantezler daha da yüksek bir önceliğe sahiptir: önce parantez içindeki ifadeler, ardından çarpma ve bölme ve ardından toplama ve çıkarma değerlendirilir.

Java'daki operatörlerin de bir öncelik sırası vardır. Aradaki fark, a) bunlardan biraz daha fazla olması, b) bazı operatörler için işlenenlerin soldan sağa, diğerleri için ise sağdan sola doğru değerlendirilmesidir.

İşte tüm Java işleçlerini içeren bir tablo:

Kategori Şebeke çağrışımsal
Sonek () [] . Soldan sağa
tekli ++ -- ! ~ Sağdan sola
Çarpımsal * / % Soldan sağa
Katkı + - Soldan sağa
vites değiştirme >> >>> << Soldan sağa
ilişkisel > >= < <= Soldan sağa
eşitlik == != Soldan sağa
bit düzeyindeAND & Soldan sağa
Exclusive OR(XOR) ^ Soldan sağa
bit düzeyindeOR | Soldan sağa
MantıklıAND && Soldan sağa
MantıklıOR || Soldan sağa
koşullu ?: Sağdan sola
Atama = += -= *= /= %= >>= <<= &= ^= |= Sağdan sola
Virgül , Soldan sağa

Üst satır, en yüksek önceliğe sahip operatörleri içerir. Parantezler, ()önceliği açıkça ayarlamak için kullanılır. Bir dizi değişkeninin belirli bir dizinindeki bir öğeye erişmek için köşeli parantezler []kullanılır. Nokta işleci ( .), bir nesneye veya sınıfa başvuru kullanarak alan ve yöntemlere erişmek için kullanılır.

Operatörler tabloda ne kadar düşükse, öncelikleri o kadar düşük olur.

Bir ifadede birden çok işleç kullanıyorsanız tembel olmayın: parantez ekleyin.

Java'da şöyle bir şey yazabilirsiniz if (a & 1<< b > ~c)ama yazmamalısınız. Yalnızca derleyici için değil, diğer programcılar için de kod yazıyorsunuz. Kod ne kadar okunabilir olursa o kadar iyidir.



3. Önek ve sonek artışı

Bildiğiniz gibi, Java'nın bir artırma operatörü ( ++) ve bir eksiltme operatörü ( --) vardır. Sırasıyla, bir değişkenin değerini artırır ve azaltırlar 1.

Muhtemelen bilmediğiniz şey, bu işleçlerin iki türü olduğudur: önek (işleç değişkenden önce gelir) ve sonek (işleç değişkenden sonra gelir). Ve iki tür operatör biraz farklı çalışır.

Java'da şöyle bir ifade yazabilirsiniz:

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

Operatör ++bir değişkenden sonra görünüyorsa ve değişken bir ifadenin parçasıysa (yukarıdaki örnekte olduğu gibi), o zaman ifade değişkenin geçerli değerini kullanır ve ancak bundan sonra değişken artırılır 1.

Başka bir deyişle, şöyle bir şey olacak:

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

Yani ilk bakışta düşündüğünüz gibi olmayacak b.56

Operatör ++değişkenden önceyse ve değişken bir ifadenin parçasıysa, önce artırılacak 1ve ancak daha sonra değeri ifadede kullanılacaktır.

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

Yukarıdaki örnek, aşağıdaki örneğe eşdeğerdir:

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

Burada, beşit olacaktır 6.

Java programcıları tarafından başka birinin de Java programcısı olup olmadığını belirlemek için kullanılan bir örnek bile var:

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

Evet, onu da yazabilirsin.

Bu örnek gayet iyi derlenecek ve şöyle bir şeye dönüşecek:

int a = 5;

a = a + 1;
int v1 = a;

a = a + 1;
int v2 = a;

int b = v1 + v2;

Operatör için --her şey tamamen aynı.