Operatörler 6.1 Operatör Nedir?

6
Operatörler
6.1
Operatör Nedir?
Operatör, bir veri tipi üzerinde tanımlı fonsiyondur. En basit örneği sayılar
üzerindeki toplama işlemidir. 1 + 2 = 3 işleminde (+) simgesi bir operatördür. 1 ve 2 sayıları ise işlenen (operand) sayılar, 3 ise işlemin sonucudur.
Her programlama dilinde verilerle işlem yapan gömülü (built-in) operatörler vardır. Ruby’de operatörler birer metottur ve işemin yapıldığı sınıf ya
da modülde geçerlidirler. Onları başka bir modülden çağırmaya gerek kalmadan çalışırlar.
Ruby dilinde çok sayıda operatör vardır. En çok kullanılan operatörlerden bazıları şunlardır:
• Aritmetik Operatörleri
• Karşılaştırma (bağlantı) Operatörleri
• Atama Operatörleri
• Mantıksal (logic) Operatörler
• İkil (bitwise) Operatörler
• Dönüştürücüler
• Denklik (identity) Operatörleri
Şimdi bunları daha ayrıntılı inceleyelim.
74
6.2
BÖLÜM 6. OPERATÖRLER
Aritmetik Operatörleri
Bütün diller sayılarla işlem yapan operatörlere sahiptir. Okullarda dört işlem diye adlandırılan toplama, çıkarma, çarpma, bölme işlemleri hemen
hemen bütün dillerde derleyiciye gömülüdür ve aynı simgeleri kullanırlar.
6.2.1
Birli Operatörler
Bir sayının önüne eksi (-) simgesi gelirse, o sayının işareti değişir. Bir sayının
önüne artı (+) gelirse, o sayı aynı kalır. Bir bakıma sayının önüne yazılan
(+) simgesi etkisizdir.
-12= -(12)
+12= 12
6.2.2
İkili Operatörler
Ruby, sayılarla işlem yapmak için +, -, *, /, %, ve ** ikili operatörlerini
kullanır. Bu operatörlerin hepsi sayılara uygulanabilir. Onlar için başka
modülden çağrı yapmaya gerek yoktur.
Ruby aritmetik operatörlerini Tablo 6.1 den görebiliriz.
Operator
+
*
/
%
**
Açıklama
Toplama
Çıkarma
Çarpma
Bölme
Modulo
kuvvet
Tablo 6.1: Aritmetik Operatörler
Açıklamalar
Ruby’de ikili aritmetik operatörlerin işlevleri Tablo 6.2’de gösterilmiştir.
6.2.3
Ruby’da Bölme İşlemi
Genel olarak bir fonkiyonun değeri değişkenlerinin veri tipine bağlıdır. Bölme
işlemi buna iyi bir örnektir. Eğer daima tamsayılarla çalışıyorsak, m ile n
74
6.2
BÖLÜM 6. OPERATÖRLER
Aritmetik Operatörleri
Bütün diller sayılarla işlem yapan operatörlere sahiptir. Okullarda dört işlem diye adlandırılan toplama, çıkarma, çarpma, bölme işlemleri hemen
hemen bütün dillerde derleyiciye gömülüdür ve aynı simgeleri kullanırlar.
6.2.1
Birli Operatörler
Bir sayının önüne eksi (-) simgesi gelirse, o sayının işareti değişir. Bir sayının
önüne artı (+) gelirse, o sayı aynı kalır. Bir bakıma sayının önüne yazılan
(+) simgesi etkisizdir.
-12= -(12)
+12= 12
6.2.2
İkili Operatörler
Ruby, sayılarla işlem yapmak için +, -, *, /, %, ve ** ikili operatörlerini
kullanır. Bu operatörlerin hepsi sayılara uygulanabilir. Onlar için başka
modülden çağrı yapmaya gerek yoktur.
Ruby aritmetik operatörlerini Tablo 6.1 den görebiliriz.
Operator
+
*
/
%
**
Açıklama
Toplama
Çıkarma
Çarpma
Bölme
Modulo
kuvvet
Tablo 6.1: Aritmetik Operatörler
Açıklamalar
Ruby’de ikili aritmetik operatörlerin işlevleri Tablo 6.2’de gösterilmiştir.
6.2.3
Ruby’da Bölme İşlemi
Genel olarak bir fonkiyonun değeri değişkenlerinin veri tipine bağlıdır. Bölme
işlemi buna iyi bir örnektir. Eğer daima tamsayılarla çalışıyorsak, m ile n
74
6.2
BÖLÜM 6. OPERATÖRLER
Aritmetik Operatörleri
Bütün diller sayılarla işlem yapan operatörlere sahiptir. Okullarda dört işlem diye adlandırılan toplama, çıkarma, çarpma, bölme işlemleri hemen
hemen bütün dillerde derleyiciye gömülüdür ve aynı simgeleri kullanırlar.
6.2.1
Birli Operatörler
Bir sayının önüne eksi (-) simgesi gelirse, o sayının işareti değişir. Bir sayının
önüne artı (+) gelirse, o sayı aynı kalır. Bir bakıma sayının önüne yazılan
(+) simgesi etkisizdir.
-12= -(12)
+12= 12
6.2.2
İkili Operatörler
Ruby, sayılarla işlem yapmak için +, -, *, /, %, ve ** ikili operatörlerini
kullanır. Bu operatörlerin hepsi sayılara uygulanabilir. Onlar için başka
modülden çağrı yapmaya gerek yoktur.
Ruby aritmetik operatörlerini Tablo 6.1 den görebiliriz.
Operator
+
*
/
%
**
Açıklama
Toplama
Çıkarma
Çarpma
Bölme
Modulo
kuvvet
Tablo 6.1: Aritmetik Operatörler
Açıklamalar
Ruby’de ikili aritmetik operatörlerin işlevleri Tablo 6.2’de gösterilmiştir.
6.2.3
Ruby’da Bölme İşlemi
Genel olarak bir fonkiyonun değeri değişkenlerinin veri tipine bağlıdır. Bölme
işlemi buna iyi bir örnektir. Eğer daima tamsayılarla çalışıyorsak, m ile n
74
6.2
BÖLÜM 6. OPERATÖRLER
Aritmetik Operatörleri
Bütün diller sayılarla işlem yapan operatörlere sahiptir. Okullarda dört işlem diye adlandırılan toplama, çıkarma, çarpma, bölme işlemleri hemen
hemen bütün dillerde derleyiciye gömülüdür ve aynı simgeleri kullanırlar.
6.2.1
Birli Operatörler
Bir sayının önüne eksi (-) simgesi gelirse, o sayının işareti değişir. Bir sayının
önüne artı (+) gelirse, o sayı aynı kalır. Bir bakıma sayının önüne yazılan
(+) simgesi etkisizdir.
-12= -(12)
+12= 12
6.2.2
İkili Operatörler
Ruby, sayılarla işlem yapmak için +, -, *, /, %, ve ** ikili operatörlerini
kullanır. Bu operatörlerin hepsi sayılara uygulanabilir. Onlar için başka
modülden çağrı yapmaya gerek yoktur.
Ruby aritmetik operatörlerini Tablo 6.1 den görebiliriz.
Operator
+
*
/
%
**
Açıklama
Toplama
Çıkarma
Çarpma
Bölme
Modulo
kuvvet
Tablo 6.1: Aritmetik Operatörler
Açıklamalar
Ruby’de ikili aritmetik operatörlerin işlevleri Tablo 6.2’de gösterilmiştir.
6.2.3
Ruby’da Bölme İşlemi
Genel olarak bir fonkiyonun değeri değişkenlerinin veri tipine bağlıdır. Bölme
işlemi buna iyi bir örnektir. Eğer daima tamsayılarla çalışıyorsak, m ile n
78
BÖLÜM 6. OPERATÖRLER
değer (rvalue) denilir. Adlarından anlaşıldığı gibi, sol ve sağ değerler, sırasıyla, eşitliğin solunda ve sağında yer alırlar. Sol-değer daima değişken
adıdır; kendisine atanan sağ-değer’in ana bellekteki adresini işaret eden
pointerdir. Ama çoğunlukla, pointer terimini kullanmayacak, alışkanlığı koruyarak değişken terimini kullanacağız.
Bileşik Atama Operatörleri
Bir değişken değeriyle işlem yapmanın bazı kolay yolları vardır. Aşağıdaki
atama operatörleri, bir değişkenin mevcut değeri ile yapılacak aritmetik
işlemleri kendiliğinden gerçekleştirir. Bunlara, bazı kaynaklarda, kısaltılmış
atama operatörleri ya da birleştirilmiş atama operatörleri denir.
Operator
=
+=
−=
∗=
/=
%=
∗∗ =
6.3.1
Açıklama
x = 123
(x += 3) == (x = x + 3)
(x -= 3) == (x = x - 3)
(x *= 3) == (x = x * 3)
(x /= 3) == (x = x / 3)
(x %= 3) == (x = x % 3)
(x **= 3) == (x = x ** 3)
Sonuç
x=
x=
x=
x=
x=
x=
126
120
369
41
0
186867
Artım ve eksim Operatörleri
Bazı dillerde, bir x sayısına 1 eklemek için x++ operatörü, 1 çıkarmak için x–
operatörü kullanılır. Ruby bunu += ve -= operatörleri ile yapar. Gerçekten
x= 3 iken
x+=1 deyimi x = x + 1 yerine geçer #=>( x == 4)
x= 3 iken
x -=1 deyimi x = x - 1 yerine geçer #=> ( x == 2)
Önerme 6.1. y değişkenine bir değer atanmış iken x = y gibi her atama
deyimi, x değişkenini yaratır ve y’in gösterdiği adresi x pointerine aktarır.
Böylece, hem x hem y aynı nesneyi işaret ederler. Buna pointerlerin eşitliği
denilir.
Tabii, her değişkenin, kendisine atanan değerin ana bellekteki adresini işaret
eden bir pointer olduğunu unutmuyoruz. x = y ataması yapılınca x ile y
aynı adresi işaret eden iki pointer olur.
Örnekler
1
> x = 15
> y = 25
79
6.4. KARŞILAŞTIRMA OPERATÖRLERI
> x = y
> print (x)
1
2
# =>
25
> z = 12345.6789
> x = z
> print (x)
# => 1 2 3 4 5 . 6 7 8 9
>
>
>
>
b = false
x = b
p r i n t ( x ) # => f a l s e
x
# => f a l s e
6.4
Karşılaştırma Operatörleri
Tablo 6.3: Karşılaştırma Operatörleri
Operatör
==
!=
>
<
>=
<=
<=>
Açıklama
solundaki ile sağındaki eşitse true, değilde false verir
Solundaki sağındakine eşitse false, değilse true verir
Solundaki sağındakinden büyükse true,
değilse false verir
Solundaki sağındakinden büyükse
false, değilse true verir
Solundaki sağındakinden büyük ya da
eşitse true, değilse false verir
Sağındaki solundakinden küçük ya da
eşitse true, değilse false verir
Solundaki sağındakine eşitse 0; solundaki sağındakinden büyükse 1; solundaki sağındakine küçükse -1 verir
===
case ifadelerinde eşitliği denetler
.eql?
Uygulanan nesne ile argüman aynı tipten ve eşitseler true, değilse false verir
equal?
Uygulanan nesne ile argümanın pointerleri aynı ise true verir
Örnek
3==5 #=> false
3!=5 #=> true
3>5 #=> false
3<5 #=> true
3>=5 #=> false
3<=5 #=> true
3<=>5 #=> -1
(1...10) === 5 #=>
true
1.eql?(1.0)
#=>
false
(obj1=
"abc"
ve
obj2 =
obj1)
ise
obj1.equal?obj2
#=> true
80
6.5
BÖLÜM 6. OPERATÖRLER
Paralel Atamalar
Kesim 5.1’de paralel atama eyleminden söz etmiş ve birden çok değişkene
tek komut satırı ile atama yapılabileceğini söylemiştik. Örneğin,
x= 15
y= 25
z= 30
atamalarını
x, y, z= 15, 25, 30
deyimi ile yapabiliriz.
Swap: Paralel atamayı iki değişkenin değerlerini kolayca takas (swap)
etmek için kullanabiliriz:
x, y = y, x
6.5.1
Dönüştürücüler
Programlamada sık sık bir sayı tipinden başka bir sayı tipine, bir stringden
sayıya, bir sayıdan strinde ya da bir nesneden string’e dönüşümler gerekir.
Hemen her programlama dilinde yapılan bu işleri Ruby çok kısa kodlarla
yapar.
to_i Metodu : to_i metodu bir sayısal değeri tamsayıya dönüştürür.
Tamsayıları aynı bırakır, kesirli sayıların kesir kısmını atarak, onu taban
tamsayıya dönüştürür. Örneğin,
1
( 1 2 3 ) . t o _ i == 123
( 1 2 3 . 4 5 6 7 ) . t o _ i == 123
to_f Metodu :
to_f metodu bir sayısal değeri float tipe dönüştürür.
Float tipleri aynı bırakır, tam sayıların sağına .0 ekleyerek onları float yapar. Sayının ondalık basamak sayısı çok fazla ise, Ruby onu yaklaşık float
sayı olarak verir. Örneğin,
3
( 1 2 3 ) . to_f == 1 2 3 . 0
( 1 2 3 . 4 5 6 7 ) . to_f == 1 2 3 . 1 2 3 . 4 5 6 7
( 1 2 3 . 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 ) . to_f
Float’tan Tam Sayıya Dönüşüm
# => 1 2 3 . 4 5 6 7 8 9 0 1 2 3 4 5 6 8
6.5. PARALEL ATAMALAR
81
Integer (123.4567) # => 123
String’den Tam Sayıya Dönüşüm
Bu metot to_i metoduna denktir.
Integer ("123") # => 123
Hexadecimal’dan Tam Sayıya Dönüşüm
Integer (0x3BACF7) # => 3910903
Octal’dan Tam Sayıya Dönüşüm
Integer (012345670) # => 2739128
Binary’den Tam Sayıya Dönüşüm
Integer (0b10101010101011) # => 10923
Karakter’den ASCII Koduna Dönüşüm
"A".getbyte(0) # => 65
Integer’den Float’a Dönüşüm Bu metot to_f metoduna denktir.
Float (123) # => 123.0
Hexadecimal’den Float’a Dönüşüm
Float (0x1ABF9) # => 109561.0
Octal’dan Float’a Dönüşüm
Float (01234567) # => 342391.0
Binary’den Float’a Dönüşüm
Float (0b101010111) # => 343.0
Örnekler: Integer(17/4) # => 4
Float(17/4) # =>4.0 ( 4.25 değil)
String’den Float’a Dönüşüm
Float sayı string olarak yazılmışken, onu float sayıya dönüştürebiliriz.
Ama aslı float olmayan stringler floata dönüştürülemez. Ruby, argument
hatası olduğu uyarısını verir.
Float ("12.4567") # => 12.4567
Float ("oniki") # =>ArgumentError: invalid value for Float():
"oniki"
2
>
>
>
>
0.99999
# => 0 . 9 9 9 9 9
( 5 basamak )
0.9999999999999999
# => 0 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ( 1 6 basamak )
0 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 # => 1 . 0
( 1 7 basamak )
0.9999999999999999999999999
# => 1 . 0
( 2 5 basamak )
82
BÖLÜM 6. OPERATÖRLER
> 0.0000000000000000
6.5.2
# =>0.0
Mantıksal Operatörler
Mantıksal operatörler (logical operators) true ya da f alse değer alan mantıksal deyimler üzerinde tanımlı operatörlerdir. Altı tanedirler
operator
and
or
&&
||
!
not
Açıklama
Mantıksal AND operatörüdür. (a and b) deyimi a ve b
true ise true, değilse false verir.
Mantıksal OR operatörüdür.(a or b) deyimi a ve b ’den
en az birisi true ise true, değilse frue verir.
Mantıksal AND operatörüdür. a ve b true iseler
a&&b == true olur.
Mantıksal OR operatörüdür. a ve b den birisi true ise
a&&b == true olur.
Mantıksal NOT operatörüdür. a true ise !a false, a false
ise !a true olur.
(not b) deyimi b nin olumsuzunu verir
Tablo 6.4: Mantıksal Operatörler
6.6
Tip Dönüştürücüler
to_s ve to_i Dönüşümleri
to_s metodu Integer tipi istenilen tabana göre string’e dönüştürür.
to_i metodu String tipinde yazılı olan sayıyı Integer tipe dönüştürür.
6.6.1
Integer’den String’e Dönüşüm
I n t e g e r . to_s ( tb )
deyimi Integer’i tb tabanına göre string biçiminde yazar.
Örnekler:
4
1 2 3 . to_s ( 2 )
1 2 3 . to_s ( 8 )
1 2 3 . to_s ( 1 6 )
1 2 3 . to_s ( 1 0 )
1 2 3 . to_s ( 3 )
1 0 2 4 . to_s ( 2 )
#
#
#
#
#
#
=>
=>
=>
=>
=>
=>
"1111011"
"173"
"7b"
"123"
"11120"
"10000000000"
6.6. TIP DÖNÜŞTÜRÜCÜLER
6.6.2
83
String’den Intege’e Dönüşüm
String.to_i(tb)
deyimi String’i tb tabanına göre yazılmış sayı olarak algılar ve onu Integer
tipine dönüştürür.
Örnekler:
4
" 1111011 " . t o _ i ( 2 ) # => 123
" 173 " . t o _ i ( 8 )
# => 123
" 123 " . t o _ i ( 1 6 )
# => 123
" 123 " . to_s ( 1 0 )
# => 123
" 11120 " . t o _ i ( 3 )
# => 123
" 10000000000 " . t o _ i ( 2 ) # => 1024
6.6.3
Bitsel Operatörler
Bitsel Operatörler (bitwise operators) ikil (binary) sistemde tamsayılar üzerinde işlem yapan operatötlerdir. Ruby’de altı tane bitsel operatör vardır.
Operatör
&
|
^
~
«
»
Örnekler
1 & 1 == 1, 1&0 ==0, 0&1 ==0
1|1 == 1, 1|0 == 1, 0|1 == 1, 0|0 == 0
1^1 == 0, 1^0 == 1, 0^1 ==1, 0^0 ==0
~1 == -2, ~0 == -1
1«1 == 1*2, m«n ==m*(2n )
1»1 == 0, m»n == m*(2−n )
Örnekler:
4
1
~1 # => −2
~−2 # => 1
−2. to_s ( 2 )
# => " −10"
" −10 " . t o _ i ( 2 )
# => −2
~0 # => −1
~−1 # => 0
−1. to_s ( 2 )
"−1" . t o _ i ( 2 )
# => " −1"
# => −1
Örnekler:
m & n : Bitsel AND (bitwise and) işlemidir. m ile n sayılarının binary
yazılışında aynı adlı basamakları AND ile birleştirilirken 1&1 == 1,
1&0 == 0, 0&1 == 0 , 0&0 == 0 alınır. Örneğin 12 & 7 = 4 olur.
1
12 = 1100
7 = 111
84
BÖLÜM 6. OPERATÖRLER
&___________
4 = 0100
m | n : Bitsel OR (bitwise or) işlemidir. m ile n sayılarının binary yazılışında aynı adlı basamakları OR ile birleştirilirken 1 | 1 == 1, 1 | 0 ==
1, 0 | 1 == 1 , 0 | 0 == 0 alınır. Örneğin 12 | 7 = 15 olur.
1
12 = 1100
7 = 111
|____________
15 = 1111
~m : Bitsel olumsuzlama (bitwise negation) operatörü. -m-1 sayısıdır.
1
~12 == −13
~7 == −8
m ^n : Bitsel Dışlayan VEYA ("bitwise exclusive or") işlemidir. m ile n
sayılarının binary yazılışında aynı adlı basamakları ^ile birleştirilirken
1^1 == 0, 1^0 == 1, 0^1 == 1 , 0^0 == 0 alınır. Örneğin 12 ^7 = 11
olur.
3
12 = 1100
7 = 111
^____________
11 = 1011
6.6.4
Basamak Kayması (shift)
Fixnum ve Bignum sınıfları sola kayma («) ve sağa kayma (») operatörlerine sahiptir. Bunlar sırasıyla sayının ikil (binary) gösteriminideki basamakları, sırasıyla, sola ve sağa kaydırırlar.
m « n:
m sayısının ikil ifadesindeki her ikil basamak n basamak sola kayar.
Sağda boş kalan basamakların yerine 0 gelir . m«n sayısı, m sayısının
2n ile çarpımına eşittir.
1
12 << 7 == 1536
m » n:
m sayısının ikil ifadesindeki her ikil basamak n basamak sağa kayar.
Solda boş kalan basamakların yerine 0 gelir . m»n sayısı, m sayısının
2−n ile çarpımına eşittir.
12 >> 3 == 1
85
6.6. TIP DÖNÜŞTÜRÜCÜLER
~1 == −2
~0 == −1
1&1 == 1
1&0 == 0
0&1 == 0
0&0 == 0
1&1 == 1
1 | 1 == 1
1^1 == 0
1^0 == 1
1<<2 == 4
1>>2 == 0
4
9
3
3
8
>a = 0 b00111100
>b = 0 b00001101
−−−−−−−−−−−−−−−−−
a&b
# => 12
#
a|b
# => 61
#
a^b
# => 49
#
~a
# => −61 #
a = 60
b = 13
c = 0
d
e
f
g
h
k
=
=
=
=
=
=
a & b
a | b;
a ^ b;
~a ;
a << 2 ;
a >> 2 ;
\# => 60
\# => 13
=>
=>
=>
=>
"1100"
"111101"
"110001"
" −111101"
# a . to_s ( 2 ) = " 1 1 1 1 0 0 "
# b . to_s ( 2 ) = " 1 1 0 1 "
# b . to_s ( 2 ) = " 0 "
#
#
#
#
#
#
=>
=>
=>
=>
=>
15
12
61
49
−61
240
#
#
#
#
#
#
d . to_s ( 2 )
e . to_s ( 2 )
f . to_s ( 2 )
g . to_s ( 2 )
h . to_s ( 2 )
K. to_s ( 2 )
#
#
#
#
#
#
=>
=>
=>
=>
=>
=>
"1100"
"111101"
110001"
" −111101"
"11110000"
"1111"
Örnekler:
5
0 b1011<<1
# => 22
22>>1
# => 11
2 2 . to_s ( 2 )
# => " 1 0 1 1 0 "
1 1 . to_s ( 2 )
# => " 1 0 1 1 "
" 0 b10110 " . t o _ i ( 2 )
# => 22
" 0 b1011 " . t o _ i ( 2 )
# => 11
0b1<<3
# => 8
8 . to_s ( 2 ) # => " 1 0 0 0 "
3
1
~0
# => −1
~−1
# => 0
−1. to_s ( 2 )
# => " −1"
"−1" . t o _ i ( 2 ) # => −1
( 0 b1011 <<1) . to_s ( 2 )
# => " 1 0 1 1 0 "
( 0 b1010&0b1100 ) . to_s ( 2 ) # => " 1 0 0 0 "
# => 22
86
6.7
BÖLÜM 6. OPERATÖRLER
Koşullu Operatör
Üçlü operatör de denilen bu operatör, if-then-else yönlendirmesinin kısa
yoludur (bkz. Bölüm 11.2.4).
6.8
Operatörin Öncelik Sıraları
Yukarıdan aşağıya göre sıralıdır. En üstteki en yüksek önceliğe, an alttaki
en düşük önceliğe sahiptir.
Liste 6.3.
3
8
13
:: .
[]
∗∗
−(unary ) +(unary ) ! ~
∗ / %
+ −
<< >>
&
| ^
> >= < <=
<=> == === != =~ ! ~
&&
||
... ...
=(+=, − = . . . )
not
and o r
Yukarıda verilen operatörlerden, şağıdakiler dışında kalanların hepsi
birer netottur.
Liste 6.4.
=, : : ,
.,
.. ,
... ,
! , not , &&, and ,
| | , or , != , ! ~
Uyarı 6.1. Atama operatörleri kullanıcı tarfından yeniden tanımlanamaz.