Ders 7 - Scala Operatörler (Operators)

10 Haz 2016 · 16 dk okuma süresi

Operatörler, derleyiciye bilinen matematiksel veya mantıksal işlemleri aktarmamızı sağlayan sembollerdir. Scala, gömülü operatörlerin ve aşağıda listelenen operatörlerin kullanılmasına olanak sağlar:

  • Aritmetik Operatörler
  • İlişkisel Operatörler
  • Mantıksal Operatörler
  • Bitwise Operatörler
  • Atama Operatörleri

Bu derste; aritmetik, ilişkisel, mantıksal, bitwise, atama ve diğer operatörleri tek tek inceleyeceğiz.

Aritmetik Operatörler:

Aşağıdaki operatörler Scala dili tarafından desteklenen aritmetik operatörler:

A ismindeki değişkenin 10 değerini, B ismindeki değişkenin ise 20 değerini tuttuğunu varsayın:

Aşağıdaki örneği inceleyerek Scala Dilinde kullanılan tüm aritmetik operatörleri anlamaya çalışın.

Aşağıdaki kodları kopyalayıp Test.Scala dosyasına yapıştırın ve derleyip çalıştırın:

object Test {
  def main(args: Array[String]) {
    var a = 10;
    var b = 20;
    var c = 25;
    var d = 25;
    println("a + b = " + (a + b) );
    println("a - b = " + (a - b) );
    println("a * b = " + (a * b) );
    println("b / a = " + (b / a) );
    println("b % a = " + (b % a) );
    println("c % a = " + (c % a) );
  }
}

Bu program aşağıdaki çıktıyı verecektir:

C:/>scalac Test.scala
C:/>scala Test
a + b = 30
a - b = -10
a * b = 200
b / a = 2
b % a = 0
c % a = 5

C:/>
Operatör Açıklama Örnek
+ İki işleneni toplar. A + B sonucu 30
- İkinci işleneni birinci işlenenden çıkarır. A - B sonucu -10
* Her iki işleneni çarpar. A * B sonucu 200
/ Payı paydaya böler. B / A  sonucu 2
% Modül ve mod(kalanı bulur) alır. B % A sonucu 0

İlişkisel Operatörler:

Aşağıdaki operatörler Scala dili tarafından desteklenen ilişkisel operatörler:

A ismindeki değişkenin 10 değerini, B ismindeki değişkenin ise 20 değerini tuttuğunu varsayın:

Aşağıdaki örnekte ilişkisel operatörler örneklendirilmiştir.

Aşağıdaki kodları kopyalayıp Test.Scala dosyasına yapıştırın ve derleyip çalıştırın:

object Test {
  def main(args: Array[String]) {
    var a = 10;
    var b = 20;
    println("a == b = " + (a == b) );
    println("a != b = " + (a != b) );
    println("a > b = " + (a > b) );
    println("a < b = " + (a < b) );
    println("b >= a = " + (b >= a) );
    println("b <= a = " + (b <= a) );
  }
}

Bu program aşağıdaki çıktıyı verecektir:

C:/>scalac Test.scala
C:/>scala Test
a == b = false
a != b = true
a > b = false
a < b = true
b >= a = true
b <= a = false

C:/>
Operatör Açıklama Örnek
== Operatörün her iki tarafındaki değeri eşit mi, eşit değil mi diye kontrol et ve eşitse true değerini döndür. (A == B) ifades true değildir.
!= Operatörün her iki tarafındaki değeri eşit mi, eşit değil mi diye kontrol et ve eşitse DEĞİLSE true değerini döndür. (A != B) ifadesi true.
> Operatörün sol tarafındaki değerin sağ tarafındaki değerden daha büyük olup olmadığını kontrol et ve daha büyükse true değerini döndür. (A > B) ifadesi true değildir.
< Operatörün sol tarafındaki değerin sağ tarafındaki değerden daha küçük olup olmadığını kontrol et ve daha küçükse true değerini döndür. (A < B) ifadesi true.
>= Operatörün sol tarafındaki değerin sağ tarafındaki değerden daha büyük veya eşit olup olmadığını kontrol et ve daha büyük veya eşitse true değerini döndür. (A >= B) ifadesi true değildir.
<= Operatörün sol tarafındaki değerin sağ tarafındaki değerden daha küçük veya eşit olup olmadığını kontrol et ve daha küçük veya eşitse true değerini döndür. (A <= B) ifadesi true.

Mantıksal Operatörler:

Aşağıdaki operatörler Scala dili tarafından desteklenen mantıksal operatörler:

A ismindeki değişkenin 1 değerini, B ismindeki değişkenin ise 0 değerini tuttuğunu varsayın:

Aşağıdaki örnekte mantıksal operatörler örneklendirilmiştir. Aşağıdaki kodları kopyalayıp Test.Scala dosyasına yapıştırın ve derleyip çalıştırın:

object Test {
  def main(args: Array[String]) {
    var a = true;
    var b = false;

    println("a && b = " + (a&&b) );
    println("a || b = " + (a||b) );
    println("!(a && b) = " + !(a && b) );
  }
}

Bu program aşağıdaki çıktıyı verecektir:

C:/>scalac Test.scala
C:/>scala Test
a && b = false
a || b = true
!(a && b) = true

C:/>
Operatör Açıklama Örnek
&& ‘Mantıksal Ve’ operatörü olarak bilinir. Eğer operatörün her iki tarafındaki işlenen sıfırdan farklıysa true değerini döndürür. (A && B) ifadesi false.
|| ‘Mantıksal Veya’ operatörü olarak bilinir. Eğer operatörün herhangi birinin sıfırdan farklı olması durumunda true değerini döndürür. (A || B) ifadesi true.
! ‘Mantıksal Değil (Logical NOT)’ operatörü olarak bilinir. Başına geldiği ifadenin değerini zıttına çevirir yani değilini alır. Eğer ifade true ise bu operatör false olarak döndürür. !(A && B) ifadesi true.

Bitwise Operatörler:

Bitwise operatörü bitler üzerinde çalışır ve bitler üzerinden işlem yapar. &, |, ve ^ sembolleri için doğruluk tablosu aşağıdaki gibidir:

p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

A = 60; ve B = 13; olarak varsayın ve Binary(ikili) değer olarak karşılıkları aşağıdaki gibi olacaktır:

A = 0011 1100

B = 0000 1101


A&B = 0000 1100

A B = 0011 1101

A^B = 0011 0001

~A  = 1100 0011

Scala dili tarafından desteklenen Bitwise operatörleri aşağıdaki tabloda listelenmiştir. A’nın değerinin 60 ve B’nin değerinin 13 olduğunu varsayarak devam edersek:

Aşağıdaki örnekte Bitwise operatörler örneklendirilmiştir. Aşağıdaki kodları kopyalayıp Test.Scala dosyasına yapıştırın ve derleyip çalıştırın:

object Test {
  def main(args: Array[String]) {
    var a = 60; /_ 60 = 0011 1100 _/
    var b = 13; /_ 13 = 0000 1101 _/
    var c = 0;

    c = a & b;            /* 12 = 0000 1100 */
    println("a & b = " + c );

    c = a | b;            /* 61 = 0011 1101 */
    println("a | b = " + c );

    c = a ^ b;            /* 49 = 0011 0001 */
    println("a ^ b = " + c );

    c = ~a;               /* -61 = 1100 0011 */
    println("~a = " + c );

    c = a << 2;           /* 240 = 1111 0000 */
    println("a << 2 = " + c );

    c = a >> 2;           /* 215 = 1111 */
    println("a >> 2  = " + c );

    c = a >>> 2;          /* 215 = 0000 1111 */
    println("a >>> 2 = " + c );
  }
}

Bu program aşağıdaki çıktıyı verecektir:

C:/>scalac Test.scala
C:/>scala Test
a & b = 12
a | b = 61
a ^ b = 49
~a = -61
a << 2 = 240
a >> 15
a >>> 15

C:/>

Operatör Açıklama Örnek
& ‘İkili Ve (Binary AND)’ operatörü her iki sayının ikili değerini karşılaştırır ve aynı değerin olduğu yerleri döndürür. (A & B) ifadesi 12’nin karşılığı olan 0000 1100 değerini verir.
| ‘İkili Veya (Binary OR)’ operatörü her iki sayının ikili değerinin karşılıklarında bulunan 1’lerin kopyasını alır. (A | B) ifadesi 61’in karşılığı olan 0011 1101 değerini verir.
^ ‘İkili XOR’ operatörü her iki sayının ikili değerini karşılaştırır ve sadece birinde bulunan değerin kopyasını alır. (A ^ B) ifadesi 49’un karşılığı olan 0011 0001 değerini verir.
~ ‘Binary Ones Complement’ operatörü tekli operatördür ve ifadenin tersini döndürür. (~A ) ifadesi -61’in imzalı(signed) ikili sayı karşılığı olan 1100 0011 değerini verir.
« ‘İkili Sola Kaydırma (Binary Left Shift)’ operatörüdür. Sol taraftaki işlenenin binary karşılığını, sağ taraftaki işlenenin değeri kadar sola kaydırır. A « 2 ifadesi 240’ın karşılığı olan 1111 0000 değerini verir.
» ‘İkili Sağa Kaydırma (Binary Right Shift)’ operatörüdür. Sol taraftaki işlenenin binary karşılığını, sağ taraftaki işlenenin değeri kadar sağa kaydırır. A » 2 ifadesi 15’in karşılığı olan 1111 değerini verir.
»> ‘Shift right zero fill’ operatorüdür. operatörüdür. Sol taraftaki işlenenin binary karşılığını, sağ taraftaki işlenenin değeri kadar sağa kaydırır ve kaydırılan değerler sıfırlarla doldurulur. A »>2 ifadesi 15 sayısının karşılığı olan 0000 1111 değerini verir.

Atama Operatörleri:

Scala dili tarafından desteklenen atama operatörleri aşağıdaki tabloda listelenmiştir.

Aşağıdaki örnekte atama operatörleri örneklendirilmiştir. Aşağıdaki kodları kopyalayıp Test.Scala dosyasına yapıştırın ve derleyip çalıştırın:

object Test {
  def main(args: Array[String]) {
    var a = 10;
    var b = 20;
    var c = 0;

    c = a + b;
    println("c = a + b  = " + c );

    c += a ;
    println("c += a  = " + c );

    c -= a ;
    println("c -= a = " + c );

    c *= a ;
    println("c *= a = " + c );

    a = 10;
    c = 15;
    c /= a ;
    println("c /= a  = " + c );

    a = 10;
    c = 15;
    c %= a ;
    println("c %= a  = " + c );

    c <<= 2 ;
    println("c <<= 2  = " + c );

    c >>= 2 ;
    println("c >>= 2  = " + c );

    c >>= 2 ;
    println("c >>= a  = " + c );

    c &= a ;
    println("c &= 2  = " + c );

    c ^= a ;
    println("c ^= a  = " + c );

    c |= a ;
    println("c |= a  = " + c );
  }
}

Bu program aşağıdaki çıktıyı verecektir:

C:/>scalac Test.scala
C:/>scala Test
c = a + b = 30
c += a = 40
c -= a = 30
c \*= a = 300
c /= a = 1
c %= a = 5
c <<= 2 = 20
c >>= 2 = 5
c >>= 2 = 1
c &= a = 0
c ^= a = 10
c |= a = 10

C:/>

Operatör Açıklama Örnek
= Temel atama operatörüdür. Sağ taraftaki işleyicinin değerini sol taraftaki işleyiciye aktarır. C = A + B ifadesi A + B değerini C’ye aktarır.
+= ‘Ekle ve Ata’ operatörüdür. Sağdaki işlenen ile soldaki işlenenin değerini toplar ve sonucu soldaki işlenene aktarır. C += A ifadesi C = C + A ifadesine eşittir.
-= ‘Çıkar ve Ata’ operatörüdür. Soldaki işlenenin değerinden sağdaki işlenenin değerini çıkarır ve sonucu soldaki işlenene aktarır. C -= A ifadesi C = C - A ifadesine eşittir.
*= ‘Çarp ve Ata’ operatörüdür. Soldaki işlenen ile sağdaki işleneni çarpar ve sonucu soldaki işlenene aktarır. C _= A ifadesi C = C _ A ifadesine eşittir.
/= ‘Böl ve Ata’ operatörüdür. Soldaki işleneni sağdaki işlenene böler ve sonucu soldaki işlenene aktarır. C /= A ifadesi C = C / A ifadesine eşittir.
%= ‘Mod Al ve Ata’ operatörüdür, Her iki işleneni kullanarak mod alır ve sonucu soldaki işlenene aktarır. C %= A ifadesi C = C % A ifadesine eşittir.
«= ‘Left shift ve Ata’ operatorüdür. C «= 2 ifadesi C = C « 2 ifadesi ile aynıdır.
»= ‘Right shift ve Ata’ operatörüdür. C »= 2 ifadesi C = C » 2 ifadesi ile aynıdır.
&= ‘Bitwise ve Ata’ operatörüdür. C &= 2 ifadesi C = C & 2 ifadesi ile aynıdır.
^= ‘bitwise exclusive VEYA ve atama operatörüdür. C ^= 2 ifadesi C = C ^ 2 ifadesi ile aynıdır.
|= ‘bitwise inclusive VEYA ve atama operatörüdür. C |= 2 ifadesi C = C | 2 ifadesi ile aynıdır.

Scala Operatörlerin Önceliği:

Operatör önceliği ifadelerin işlem gruplandırmasını belirler. Bu ifadeye nasıl değer biçileceğini etkiler. Bazı operatörlerin diğerlerine göre yüksek öncelikleri vardır. Örneğin; çarpma operatörünün, toplama operatörüne göre önceliği daha yüksektir. Örneğin; x = 7 + 3 * 2; ifadesi 20 sayısına değil, 13 sayısına eşittir, çünkü çarpma işaretinin toplama işaretine göre daha yüksek önceliği vardır. Bu sebeple işlemde ilk olarak 3*2 ifadesi yapıldı ve çarpa ifadesinden gelen sonuç 7 ile toplandı. Aşağıdaki tabloda en yüksek önceliğe sahip operatörler tablonun üst kısmından, önceliği en düşük operatöre kadar aşağıya doğru sıralanmıştır. Önceliği yüksek olan operatörler ilk değerlendirmeye alınacak operatörlerdir.

Kategori Operatör Okunuş
Postfix () [] Soldan Sağa
Unary ! ~ Sağdan Sola
Multiplicative * / % Soldan Sağa
Additive + - Soldan Sağa
Shift » »> « Soldan Sağa
Relational > >= < <= Soldan Sağa
Equality == != Soldan Sağa
Bitwise AND & Soldan Sağa
Bitwise XOR ^ Soldan Sağa
Bitwise OR | Soldan Sağa
Logical AND && Soldan Sağa
Logical OR || Soldan Sağa
Assignment = += -= *= /= %= »= «= &= ^= |= Sağdan Sola
Comma , Soldan Sağa