Mantıksal (Logic) Operatörler Bilgisayar dillerinin hemen hepsinde, program akışını kontrol edebilmek ve yönlendirebilmek için mantıksal operatörler kullanılır. Java dilinde kullanılan mantıksal operatörler aşağıda açıklanmıştır. boolean a, b; olmak üzere, mantıksal operatörlerin etkisi aşağıdaki tablodan görülebilir: İşlem Operatör Açıklama a && b Mantıksal ve Kısa devre ve a b Mantıksal veya Kısa devre veya a & b Mantıksal ve Uzun devre ve a b Mantıksal veya Uzun devre veya a ^ b Dışarmalı (exclusive) veya!a Değilleme Kısa devre (x!= 0) && (1/x > 1) Güvenli Uzun devre (x!= 0) & (1/x > 1) Güvenli değil Örnekler: && ve mantıksal operatörlerinin farklı kullanım biçimlerini örnekler üzerinde göreceğiz. Aşağıdakiler bu konuda biraz ipucu verebilirler. bool aa = false; bool bb =!aa; ise bb nin değeri true olur. Bölüm 06: Operatörler 1
int i=8, j=14; bool xxx = i>4 && j<12; ise, xxx false değerini alır. Oysa, bool yyy = i>3 j<10; ise yyy 'nin değeri true olur. bool zzz = (i>3 && j<10) (i<9 && j>10) ise, zzz nin değeri true olur. boolean b; b =!(3 > 2); // b is false b =!(2 > 3); // b is true boolean b; b = 3 > 2 && 5 < 7; // b is true b = 2 > 3 && 5 < 7; // b is now false boolean b; b = 3 > 2 5 < 7; // b is true b = 2 > 3 5 < 7; // b is still true b = 2 > 3 5 > 7; // now b is false Java dilinde, mantıksal deyimleri birbirlerine bağlamak için iki operatör kullanılır && Logical AND (Mantıksal VE) Logical OR (Mantıksal VEYA) Kısa Devre AND Operatörü: && boolean1 ve boolean2 iki mantıksal deyim olmak üzere, bu iki deyimin mantıksal VE ile birbirlerine bağlanması için boolean1 && boolean2 yazılır. Bu mantıksal bir bileşkedir. Bilindiği gibi, bileşenlerinden her ikisi de doğru olduğunda bileşke deyim doğru, aksi halde yanlıştır. boolean1 && boolean2 deyiminde Her iki operand boolean olmalıdır Sonuç boolean dir Her iki operand true ise sonuç true, değilse false olur Soldaki operand false ise, sağdaki operand değerlendirilmez (koşullu deyim) true && true = true; false && true = false; // her iki operand değerlendirildi // yalnız soldaki operand değerlendirildi Bölüm 06: Operatörler 2
Dolayısıyla, boolean1 yanlış ise, boolean2 nin değeri hesaplanmaz. Çünkü boolean2 doğru olsa bile bileşik deyim yanlış olacaktır. O nedenle, bu deyime koşullu VE deyimi ya da kısadevre-ve deyimi denir. KoşulluAND01.java public class KoşulluAND01 { int a = 0; int b = 1; if (a == 0 && b == 1) { Doğru System.out.println("Doğru"); else { System.out.println("Yanlış"); LogicDemo.java public class LogicDemo { boolean a = true; boolean b = false; System.out.println("a && b = " + (a && b)); System.out.println("a b = " + (a b)); System.out.println("!(a && b) = " +!(a && b)); a && b = false a b = true Bölüm 06: Operatörler 3
!(a && b) = true LogicOR1.java public class LogicOR1 { int x = 10; if(x == 15 x ==10) { 10 sayısı 5 ile bölünebilir. System.out.println( x + " sayısı 5 ile bölünebilir."); Kısa Devre OR: Boolean1 boolean2 deyiminde boolean1, true ise, boolean2 nin değeri ne olursa olsun Boolean1 boolean2 deyimi true olacaktır. O nedenle, boolean1 true değer alınca, derleyici boolean2 yi denetlemez; Boolean1 boolean2 bileşkesinin true olduğuna karar verir. Buna Kısa Devre OR deyimi denilir. KısaDevreOR2.java public class KısaDevreOR2 { int x = 12; if(x == 12 x ==7) { 12 sayısı 4 ile bölünebilir. System.out.println( x + " sayısı 4 ile bölünebilir."); Mantıksal Operatörler Bölüm 06: Operatörler 4
Operator Açıklama & Logical AND Logical OR ^ Logical XOR (exclusive OR) Short-circuit OR && Short-circuit AND! Logical unary NOT &= AND assignment = OR assignment ^= XOR assignment == Equal to!= Not equal to?: Ternary if-then-else MantıksalOperatörler01.java public class MantıksalOperatörler01 { // && (Koşullu - Kısa Devre AND) operatörü için tablo System.out.printf( "%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n", "Koşullu AND (&&)", "false && false", ( false && false ), "false && true", ( false && true ), "true && false", ( true && false ), "true && true", ( true && true ) ); // (Koşullu - Kısa Devre OR) operatörü için tablo System.out.printf( "%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n", "Koşullu OR ( )", "false false", ( false false ), "false true", ( false true ), "true false", ( true false ), "true true", ( true true ) ); // & (boolean lojik AND) operatörü için tablo System.out.printf( "%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n", "Boolean logic AND (&)", "false & false", ( false & false ), "false & true", ( false & true ), "true & false", ( true & false ), "true & true", ( true & true ) ); // (boolean lojik OR) operatörü için tablo Bölüm 06: Operatörler 5
System.out.printf( "%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n", "Boolean lojik (inclusive) OR ( )", "false false", ( false false ), "false true", ( false true ), "true false", ( true false ), "true true", ( true true ) ); // ^ (XOR) operatörü için tablo System.out.printf( "%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n", "Boolean lojik (exclusive) OR (^)", "false ^ false", ( false ^ false ), "false ^ true", ( false ^ true ), "true ^ false", ( true ^ false ), "true ^ true", ( true ^ true ) ); //! (lojik değilleme) operatörü için tablo System.out.printf( "%s\n%s: %b\n%s: %b\n", "Logical NOT (!)", "!false", (!false ), "!true", (!true ) ); Koşullu AND (&&) false && false : false false && true : false true && false : false true && true : true Koşullu OR ( ) false false : false false true : true true false : true true true : true Boolean lojik AND (&) false & false false & true true & false true & true : false : false : false : true Boolean lojik (inclusive) OR ( ) false false : false false true : true Bölüm 06: Operatörler 6
true false true true : true : true Boolean lojik (exclusive) OR (^) false ^ false : false false ^ true : true true ^ false : true true ^ true : false Logical NOT (!)!false!true : true : false BooleanLojik01.java public class BooleanLojik01 { boolean a = true; boolean b = false; boolean c = a b; boolean d = a & b; boolean e = a ^ b; boolean f = (!a & b) (a &!b); boolean g =!a; System.out.println(" a = " + a); System.out.println(" b = " + b); System.out.println(" a b = " + c); System.out.println(" a&b = " + d); System.out.println(" a^b = " + e); System.out.println("!a&b a&!b = " + f); System.out.println("!a = " + g); a = true b = false a b = true a&b = false a^b = true!a&b a&!b = true Bölüm 06: Operatörler 7
Mantık01.java!a = false public class Mantık01 { int rakam = 7; int sayı = 11; int limit = 13; if (++rakam % 2 == 0 & ++sayı < limit) { System.out.println("if bloku çalışıyor"); System.out.println(rakam); System.out.println(sayı); System.out.println("if bloku çalışmıyor"); System.out.println(rakam); System.out.println(sayı); if bloku çalışmıyor 8 12 BooleanNOT_01.java public class BooleanNOT_01 { int a = 0; if (!(a == 0)) { System.out.println("a sayısı 0 değil"); else { System.out.println("a sayısı 0 dır"); Bölüm 06: Operatörler 8
a sayısı 0 dır KısaDevre01.java public class KısaDevre01 { static boolean test1(int m) { System.out.println("test1(" + m + ")"); System.out.println("Sonuç: " + (m < 1)); return m < 1; static boolean test2(int m) { System.out.println("test2(" + m + ")"); System.out.println("Sonuç: " + (m < 2)); return m < 2; static boolean test3(int m ) { System.out.println("test3(" + m + ")"); System.out.println("Sonuç: " + (m < 3)); Return m < 3; if (test1(0) && test2(2) && test3(2)) System.out.println("Deyim doğrudur"); else System.out.println("Deyim yanlıştır"); test1(0) Sonuç: true test2(2) Sonuç: false Deyim yanlıştır Aşağıdaki programın yalnızca ilk deyimi denetlediğini, ikinci deyimi denetlemeye gerek kalmadığını Bölüm 06: Operatörler 9
görebilirsiniz. Boolean02.java public class Boolean02 { static boolean aaaa() { System.out.println("aaaa fonksiyonu çağrıldı"); return false; static boolean bbbb() { System.out.println("bbbb fonksiyonu çağrıldı"); return true; System.out.println("regular AND:"); System.out.println("Sonuç : " + (aaaa() & bbbb())); System.out.println(); System.out.println("kısa-devre AND:"); System.out.println("Sonuç : " + (aaaa() && bbbb())); /* */ aaaa() = false olduğu için Kısa-devre AND deyimi bbbb() metodunu çağırmaz Çıktı regular AND: aaaa fonksiyonu çağrıldı bbbb fonksiyonu çağrıldı Sonuç : false kısa-devre AND: aaaa fonksiyonu çağrıldı Sonuç : false Bölüm 06: Operatörler 10
Boolean03.java public class Boolean03 { int x = 7; int y = 3; false true false true false System.out.println((x == y-1)&& (7 < 6) ); System.out.println(5 >= 4 && 7 < 6 + 3); System.out.println(5!= 4 && y+2 == 6); System.out.println(!(5 == 4) && 7 > 6); System.out.println(x==y); OR Operatörü: boolean1 ve bolean2 iki mantıksal deyim olmak üzere, bu iki deyimin mantıksal VEYA ile birbirlerine bağlanması için boolean1 boolean2 yazılır. Bu yeni bir mantıksal deyimdir. Bileşenlerinden herhangi birisi doğru olduğunda bileşke deyim doğru, ancak her iki bileşeni yanlış olduğunda bileşke deyim yanlış olur. boolean1 doğru ise, boolean2 nin değeri hesaplanmaz. Çünkü boolean2 yanlış olsa bile bileşke deyim doğru olacaktır. O nedenle, bu deyime bazen kısa-devre_veya mantıksal deyimi denir. Aşağıdaki programın yalnızca ilk deyimi denetlediğini, ikinci deyimi denetlemeye gerek kalmadığını görebilirsiniz. Boolean04.java Bölüm 06: Operatörler 11
public class Boolean04 { short x = 13; byte y = 9; Çıktı false true true true fals System.out.println((x == y-1) (7 < 6) ); System.out.println(5 >= 4 7 < 6 + 3); System.out.println(5!= 4 y+2 == 6); System.out.println(!(5 == 4) 7 > 6); System.out.println(x==y); Boolean05.java public class Boolean05 { static boolean cccc() { System.out.println("cccc metodu çağrıldı"); return true; static boolean dddd() { System.out.println("dddd metodu çağrıldı"); return false; System.out.println("regular OR:"); System.out.println("sonuç : " + (cccc() dddd())); System.out.println(); System.out.println("kısa-devre OR:"); System.out.println("sonuç : " + (cccc() dddd())); Çıktı regular OR: cccc metodu çağrıldı dddd metodu çağrıldı sonuç : true kısa-devre OR: Bölüm 06: Operatörler 12
cccc metodu çağrıldı sonuç : true Başka Operatörler Java dilinde aşağıdaki operatörleri de kullanırız. Operand Açıklama << Sola kayan bit işlemi (left shift bitwise operator) >> Sağa kayan bit işlemi (right shift bitwise operator). Nesne öğelerine erişim (member access for objects) [ ] Array indisleme (indexing operator used in arrays and collections) ( ) Veri dönüştürme operatörü (cast operator)?: Koşullu deyim operatörü (ternary operator) Bunları dersin başka bölümlerinde göreceğiz. Bölüm 06: Operatörler 13