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.
© Copyright 2024 Paperzz