Bölüm 7 İfadeler ve atamalar ISBN 0-321-49362-1
7. Bölüm konuları Giriş Aritmetik ifadeler Çok anlamlı (overloaded) operatörler Tip dönüşümleri (conversions) İlişkisel ve Boolean İfadeler Kısa-devre hesaplama Atama komutları Karışık-mod atamalar
Giriş İfadeler programlama dillerinde temel hesap gösterim yolu İfadeleri doğru anlamak için operatör önceliğini ve işlenenlerin (operand) hangi sırada işlendiğini bilmek lazım Komutlu dillerde atamanın rolü büyüktür
Aritmetik ifadeler Aritmetik hesap yapma ilk programlama dillerindeki motivasyonlardan biri Arithmetic ifadeler operatörlerden, işlenenlerden (operands) (operatörlerin parametrelerinden), parantezlerden ve fonksiyon çağırmalarından oluşur.
Aritmetik ifadelerin tasarım problemleri Operatör öncelik kuralları Operatör birleşebilirlik (associativity) kuralları İşlenen hesaplanma sırası kuralları (order of operand evaluation) İşlenen hesaplamasının yan etkileri Çok anlamlı operatörler (Operator overloading) İfadelerde değişik tiplerin olması
Aritmetik ifadeler: operatörler Tekli (unary) İkili (binary) Üçlü (ternary)
Aritmetik ifadeler: Operatör önceliği kuralları Ayni ifade içinde farklı operatörlerden hangisin daha önce işleme konulacağını belirtir Tipik öncelik seviyeleri parantezler tekli operatörler ** (üs operatörü) *, / +, -
Aritmetik ifadeler: Operatör birleşebilirlik kuralları İki tane ayni operatörün yanyana kullanıldığı durumlarda hangisinin önce işleme gireceğini belirleyen kurallar. Tipik birleşebilirlik kuralları Soldan sağa, ** hariç (sağdan sola) Tekli operatörler bazen sağdan sola APL farklı; tüm operatörler eşit öncelikte ve sağdan sola birleşirler Parantez kullanarak öncelik ve birleşebilirlik kurallarını geçersiz kılabiliriz
Aritmetik ifadeler: Şartlı ifadeler C-tabanlı diller (ör: C, C++) Örnek average = (count == 0)? 0 : sum / count Aşağıdaki ile ayni if (count == 0) average = 0 else average = sum /count
Aritmetik ifadeler: Yan etkiler Fonksiyonel yan etkiler: fonksiyon giriş-çıkış parametresini veya lokal olmayan değişkeni değiştirdiğinde meydana gelir Yan etkilerin olumsuz neticeleri: Bir fonksiyon içinde bulunduğu ifadenin değişkenini değiştirise işlenenlerin (operand) işlenme sırası önem kazanır a = 10; /* fun ın parametresini değiştirdiğini farzedelim */ b = a + fun(a);
Çok amaçlı (overloaded) operatörler Birden çek amaç için kullanılan operatörler Yaygın olarak kullanılan lara örnek: tamsayı ve kayan nokta için + C++, Ada, Fortran 95, ve C# kullanıcıtanımlı çok amaçlı operatör tanımlanmasına olanak sağlarlar Olası problem: Okunabilirlik zaafiyete uğrayabilir. Ayni görünen operatörler farklı işler yapıyor.
Tip dönüşümleri Daraltan dönüşüm: yeni tipin değerleri eski tipin altkümesi. ör: float dan int e Genişleten dönüşüm: : eski tipin değerleri yeni tipin altkümesi. ör: int den float a
Tip dönüşümleri: Karışık mod Karışık mod ifade: içinde değişik türden işlenen var Zorlama: derleyicinin otomatik olarak yaptığı tip dönüşümü Zorlamaların dezavantajı: Derleyicinin tip hatalarını bulma yeteneğini azaltır Birçok dilde sayısal tipler zorlama yolu ile daha geniş tiplere dönüştürülürler Ada dilinde hemen hemen hiç zorlama yoktur.
Açık tip dönüşümleri Kullanıcı tarafından yapılır Kalıplama (casting) diye adlandırılır Örnekler C: (int)angle Ada: Float (Sum)
Tip dönüşümleri: ifadelerde hatalar Sebepler Aritmetiğin kendi sınırları (sıfırla bölme vs.) Bilgisayar aritmetiğinin sınırları (taşma vs.)
İlişkisel ve Boolean ifadeler <, >, >=, <=,!=, ==,.NE., <>
İlişkisel ve Boolean ifadeler... Boolean ifadeler İşlenenler ve netice Boolean Örnek operatörler FORTRAN 90 C Ada and && and or or not! not xor
İlişkisel ve Boolean ifadeler: C dilinde Boolean yok C dilinde 0=yanlış, 0 dışında bir değer: doğru a < b < c ifadesinin anlamı ne?
Kısa devre hesaplama Tüm operatörleri ve işlenenleri kullanmadan neticeyi bulma Örnek: (13*a) * (b/13 1) a sıfır ise (b/13-1) değerini hesplamaya gerek yok
Kısa devre hesaplama... C, C++, ve Java dillerinde: && ve kısa devre olarak hesaplanır, bit operatörleri & ve ise tam olarak hesaplanır Kısa devre hesaplamanın yanetkiler ile etkileşimini iyi düşünmek gerekir ör: (a > b) (b++ / 3)
Atama ifadeleri Genel sentaks <hedef_değişken> <atama_operatörü> <ifade> <expression> Atama operatörü = FORTRAN, BASIC, ve C-tabanlı diller := ALGOL, Pascal, Ada
Atama ifadeleri: şartlı hedefler Perl dilinde ($flag? $total : $subtotal) = 0 Eşdeğeri if ($flag){ $total = 0 } else { $subtotal = 0 }
Atama ifadeleri: Bileşik operatörler a = a + b yerine a += b
Atama ifadeleri: Tekli atama operatörleri Artırma ve atama işlemlerini birleştirir Örnekler sum = ++count (önce-artırma) sum = count++ (sonra-artırma) count++ -count++ (count önce artırma, sonra eksi)
İfade olarak atama komutu C, C++, ve Java dillerinde atama işlemi netice verebilir ve bu netice işlenen olarak kullanılabilir Örnek: while ((ch = getchar())!= EOF){ }
Liste atamaları Perl ve Ruby dillerinde: ($first, $second, $third) = (20, 30, 40);
Karışık mod atama Örnek int a, b; float c; c = a / b; Fortran, C, ve C++ dillerinde herhagi nümerik değer herhangi nümerik tipteki değişkene atanabilir Java dilinde sadece genişleten atama zorlamaları var Ada dilinde atama zorlaması yok
Özet İfadeler Operatör önceliği ve birleşebilirliği Çok amaçlı operatörler Karışık-tip ifadeler Değişik atama türleri