İşlem Önceliği (Operator Precedence)
Yazan : Şadi Evren ŞEKER
Bilgisayar bilimlerinde önemli konulardan birisi olan programlama dillerinin işlemleri yapma sırasını belirler. Bir programlama dilinde işlem önceliği bir iki farklı unsura göre belirlenir. Öncelikle sonucu etkileyen ve işlemin matemetiksel önceliğine göre bir tercih yapılır. Örneğin çoğu C benzeri dillerde C dilindeki işlem öncelikleri kullanılır.
İçerik
1. Soldan sağa öncelik (left to right precedence)
2. Sağdan sola öncelik (right to left precedence)
3. İşlemlerde kısa devre (Short Circuit)
4. İşlemlerde kısa devreden doğan Yan Etki (Side Effect)
5. İşlemlerde çalışma önceliğinden doğan Yan Etki (Side effect)
Bilindiği üzere programlama dilleri kesin (Deterministic) dillerdir ve muğlak ifadelere (ambiguity) izin verilmez. Dolayısyla bu işlem önceliğinin yanında aynı öncelikli işlemlerinde belirli bir sıraya göre yapılması gerekir.
Bu aşamada soldan sağa öncelik (left to right precedence) ve sağdan sola öncelik (right to left precedence) şeklinde iki seçim yapılabilir.
Soldan sağa öncelik (left to right precedence)
Aynı önceliğe sahip işlemlerin soldan sağa doğru çalıştırılmasıdır. Aşağıdaki örneği ele alalım:
3 + 5 + 7 + 9
Programlama dili tasarlanırken şayet soldan öncelik verilirse yukarıdaki işlemin yapılma sırası aşağıdaki şekilde olur.
(((3+5) + 7 ) + 9 )
Yukarıda görüldüğü üzere önce soldaki işlem sonra bu işlemin sonucu üzerinden sırayla soldan sağa diğer işlemler yapılır.
Sağdan sola öncelik (right to left precedence)
Aynı önceliğe sahip işlemlerin sağdan sola doğru çalıştırılmasıdır. Aşağıdaki örneği ele alalım:
3 + 5 + 7 + 9
Programlama dili tasarlanırken şayet sağdan öncelik verilirse yukarıdaki işlemin yapılma sırası aşağıdaki şekilde olur.
(3 + ( 5 + ( 7 + 9 )))
Yukarıda görüldüğü üzere önce sağdaki işlem sonra bu işlemin sonucu üzerinden sırayla soldan sola doğru diğer işlemler yapılır.
İşlemlerde kısa devre (Short Circuit)
Mantıksal işlemlerde, derleyici (compiler) bazı işlemleri kısa devre yapabilir. Örneğin aşağıdaki en basit mantıksal işlemler olan ve (and) ve veya (or) işlemlerini ele alalım.
| a | b | VEYA (Or) |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
| a | b | VE (And) |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Yukarıdaki tabloda görüldüğü üzere Ve işlemi sırasında a veya b taraflarından bir tanesinin 0 olması sonucun doğrudan 0 olmasına ve benzer şekilde Veya işlemi sırasında da tarafların bir tanesinin 1 olması sonucun 1 olmasına sebep olmaktadır.
Programlama dilleri tasarlanırken bu durumdan faydalanarak hız artışı sağlanır. Örneğin aşağıdaki eğer satırını (if statement) ele alalım:
if( a < 5 || b < 10)
Yukarıdaki bu kontrolde a’nın değerinin 5′ten küçük ve b’nin değerinin 10′dan büyük olması kontrol edilmiştir. Şayet a’nın değeri 5′ten küçükse bunun anlamı yukarıdaki Veya işleminin sonucunun doğru (true) çıkacağıdır ve bu durumda işlemin geri kalanı olan b<10 kontrolü yapılmaz.
Benzer şekilde aşağıdaki kontrolde de Ve işlemi kısa devre yapılabilir:
if( a < 5 && b < 10)
Yukarıda Ve kontrolü sırasında şayet a değişkenin değeri 5′e büyük veya eşitse kontrolün bu ilk kısmı yanlış (false) olarak dönecektir. Bu durumda kontrolün ikinci kısmına bakılmasına gerek kalmayacak ve sonuç yanlış (false) olarak değerlendirilerek eğer satırına (if statement) girilmeyecektir.
İşlemlerde kısa devreden doğan Yan Etki (Side Effect)
İşlemlerin çalıştırılması sırasında beklenmeyen durumların oluşmasına yan etki ismi verilir. Örneğin aşağıdaki kodu inceleyelim:
if ( a < 5 || ++ b > 4)
Yukarıdaki satırda programı yazan programcı büyük ihtimalle a’nın 5′ten küçük olup olmadığını kontrol etmiş ve ayrıca b’nin değeri bir arttırıldığında 4′ten büyük olup olmadığı kontrol etmiştir.
Ancak yukarıdaki bu niyet gerçekleşmeyebilir. Bir önceki konuda gördüğümüz kısa devre (shor circuit) işlemi gerçekleşirse ve a’nın değeri 5′ten küçükse programlama dili kotnrolün ilk kısmı doğru olduğu ve kontrol bir Veya işlemi olduğu için ikinci kısma bakmaksızın sonucu doğru ilan edecektir. Ne yazık ki programcının b’nin değerini 1 arttırma beklentisi de gerçekleşmiyecektir.
Örnek bir çalışma için :
a=3 , b=7
ile yukarıdaki kontrol yapılırsa çalışma sonucunda b= 7 olarak kalır. Ancak
a=7 , b=7
ile yukarıdaki kontrol yapılırsa çalışma sonucunda b = 8 olarak değişir.
İşlemlerde çalışma önceliğinden doğan Yan Etki (Side effect)
Programlama dillerinin işlemleri soldan sağa veya sağdan sola doğru çalıştırdığını görmüştük. Bu durum bir takım beklenmedik yan etkilere sebep olabilir. Örneğin aşağıdaki kodu ele alalım:
int i = 1;
f(){
i=i+2;
}
g(){
i=i*2;
}
main(){
int j = f() + g() + i++;
print(j);
}
Yukarıdaki kodu incelediğimizde i isminde bir global değişken tanımlanmıştır. Bu değişken f fonksiyonunda 2 arttırılmış, g fonksiyonunda ise 2 ile çarpılmıştır.
Buradaki soru main fonksiyonunda j değişkenin değerinin ne olacağıdır.
Şayet soldan sağa öncelikli çalıştırma yapılıyorsa bu durumda önce f sonra g fonksiyonları çalıştırılarak toplanacak ardından da i’nin değeri 1 arttırılarak sonuca eklenecektir. Yani sırasıyla:
f() -> i = 3 olacak
g() -> i = 6 olacak
j değeri için 3 + 6 + 7 = 16 bulunacaktır.
Ancak çalışma sırası sağdan sola öncelikli olsaydı:
i’nin değeri 1 arttırılarak 2 olacaktı
g() -> i= 4 olacak
f() -> i = 6 olacak
sonuçta j için 6 + 4 + 2 = 12 bulunacaktır.
Yukarıda da görüldüğü üzere programlama dilinin işlemlerin önceliği aynı olduğunda bile hangi sırayı kullandığı çok önemlidir. Yani toplama işleminin yer değiştirme özelliği bulunur ama bu özellik yukarıdaki şekilde yazılan kodlarda problem olabilir.
« Boyer Moore Dizgi Arama Algoritması (Boyer-Moore String Search) | Allen Fasıla Mantığı (Allen’s Interval Logic) »
Yorumlar
Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'İşlem Önceliği (Operator Precedence)' isimli yazı 20 May 2009 tarihinde, saat: 13:11 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam 1079 defa okunmuştur.
Benzer yazıları C/C++, Derleyiciler, JAVA, Programlama Dilleri kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.
Yazarın Kitabı
Bu yazının yazarı Şadi Evren ŞEKER'in son çıkan kitabı "Programlama ve Veri Yapılarına giriş (C, C++ ve JAVA ile)" hakkında bilgi almak için Buraya tıklayabilirsiniz.
Eklenen Son Yazılar
- Visual Basic ile Gösterici (Pointer) Kullanımı
- Hasse Çizgeleri (Hasse Diagrams)
- Zeki Vekiller (Akıllı Ajanlar, Intelligent Agents, Zeki Etmenler )
- Integral Kriptoanalizi ( Toplam Tecessüsü , Integral Cryptoanalysis)
- Diferansiyel Kriptoanalizi ( Fark Tecessüsü , Differential Cryptoanalysis)
- Sierpinski Üçgeni (Sierpinski Triangle)
- C ile programlamaya giriş final sınavı çözümleri
- Çok Seviyeli Sıralar (Multi Level Queues)
- Çift Özetleme (Double Hashing)
- İkinci Dereceden Sondalama (Quadratic Probing)
Yapılan Son Yorumlar
- Şadi Evren ŞEKER: Sıralama işleminiz poligonu...
- Şadi Evren ŞEKER: bahsettiğiniz sıralama algoritması...
- Abdurrahman ulusoy: merhaba hocam. gelişigüzel...
- Oguz Okutan: Merhaba hocam.. Fonksiyonlarda degere göre...
- Şadi Evren ŞEKER: Null, NULL, nil veya null olarak...
- Fatih Kabakci: hocam merhabalar,...
- kara: Çok güzel anlatılmış gerçekten teşekkürler...
- Şadi Evren ŞEKER: Bahsettiğiniz şekil dönüşümü...
- Caner: Kullanıcıdan açı girdisi almıyorsanız...
- Furkan Yediyildiz: Algoritmanin mantigi cok güzel...
- havva: çok sağolun çok güzel açıklamalar var tşk...
- Şadi Evren ŞEKER: typedef komutu, bir yapıdan yeni bir...
- fatih kabakci: hocam ben structures ile ilgili bir sorum...
- Şadi Evren ŞEKER: evet, yukarıda açıklanan, herhangi...
- Abdurrahman ulusoy: fi açısından teta kadar döndürme...
- Şadi Evren ŞEKER: Hayır yok, bir noktanın, herhangi...
- Abdurrahman ulusoy: Bu durumda yukarıdaki formüllerin...
- Abdurrahman ulusoy: Merhaba hocam Üstteki mesajımda...
- mustafa ekmekcioğlu: merhaba şadi bey ben hacettepe...
- Şadi Evren ŞEKER: Talebiniz üzerine...
Yakın Yazılar
İşlem Önceliği (Operator Precedence)
İlişkisel Cebir (Relational Algebra)
İşlem Yükleme (Operator Overloading)
Priority Queue (Öncelik Sırası, Rüçhan Sırası)
CSMA ( Çoklu Erişimde Hat Kontrolü, Carrier Sense Multiple Access)
Gösterim İşlemi (Projection Operator)
Çok Seviyeli Sıralar (Multi Level Queues)
Seçim İşlemi (Selection Operator)
Fark İşlemi (Difference Operator)
Küme Bölme İşlemi (Set Division Operator)
Birleşim İşlemi (Union Operator)
En Kısa İş İlk (Shortest Job First)
C Dilinde Operatörler (işlemler, operators)
Şekli Mantık (Kipler Mantığı, Modal Logic)
Zamansal Mantık (Temporal Logic)
Bağlantılar