Bölüm 7 Deyimler ve Atama ifadeleri ISBN 0-321-49362-1
Bölüm 7 Konuları Giriş Aritmetik deyimler Aşırı yüklenmiş operatörler Tip dönüşümleri İlişkisel ve mantıksal deyimler Kısa devre hesaplamalar(short-circuit Evaluation) Atama İfadeleri Karışık kip atamalar(mixed-mode) Wesley. All rights reserved. 1-2
Giriş Programlama dilinde hesaplamanın yapıldığı temel yapılar deyimlerdir. Deyimin nasıl hesaplandığını anlamak için, operatörlerin sırasını ve nasıl işlediğini bilmeye ihtiyaç vardır. Emirsel dillerin özü atama ifadelerinin baskın olmasıdır. Wesley. All rights reserved. 1-3
Aritmetik Deyimler Aritmetik hesaplama işlemi ilk programlama dillerinin temel amaçlarından biriydi. Aritmetik deyimler operatörler(işleç), işlenenler(operands),parantez ve fonksiyon çağrılarından oluşur. Wesley. All rights reserved. 1-4
Aritmetik Deyimler: Tasarım Konuları Aritmetik deyimler için tasarım konuları İşleç öncelik kuralları İşleçlerin birleşme kuralları İşleç hesaplamada sıra İşleç hesaplamadaki yan etkiler İşleç aşırı yükleme Kip birleştirme deyimleri(mode mixing expressions) Wesley. All rights reserved. 1-5
Aritmetik Deyimler: İşleçler(Operators) Birli işleçte(operator) tek işlenen olur Bir ikili işleçte iki işlenen olur Üçlü işleçte üç işlenen olur Wesley. All rights reserved. 1-6
Aritmetik Deyimler: İşleç Öncelik Kuralları İşleç öncelik kuralları komşu işleçlerden hangisinin önce hesaplamada kullanılacağını belirtir. Tipik öncelik seviyeleri parantezler Birli işleçler ** (dil destekliyorsa) *, / +, - Wesley. All rights reserved. 1-7
Aritmetik Deyimler: İşleç Birleşme Kuralları İşleç birleşme kuralları aynı seviyedeki işleçlerin hesaplamada kullanım sırasını belirtir. Tipik birleşme kuralları Soldan sağa, ** hariç, bu sağdan sola Bazen birli işleçler sağdan sola birleşime uğrarlar (örn, FORTRAN da) APL farklıdır; tüm işleçler eşit önceliğe sahiptir ve sağdan sola işlenirler. Öncelik ve birleşme kuralları parantezler kullanılarak değiştirilebilir. Wesley. All rights reserved. 1-8
Aritmetik Deyimler: Şartlı deyimler(conditional expressions) Şartlı deyimler C-temelli diller(örn., C, C++) örnek: average = (count == 0)? 0 : sum / count Aşağıdaki şekilde yazılmış gibi hesaplanır if (count == 0) average = 0 else average = sum /count Wesley. All rights reserved. 1-9
Aritmetik Deyimler: işleç hesaplanma sırası İşleç hesaplanma sırası 1. Değişkenler: bellek bölgesindeki değeri alır. 2. Sabitler: bazen bellek bölgesi değeri alır; bazen sabit makine dili komutu olabilir 3. Parantezlenmiş deyimler: tüm işleç ve işlenenleri önce yapılır. Wesley. All rights reserved. 1-10
Aritmetik Deyimler: Potansiyel yan etkiler Fonksiyonel yan etkiler: Fonksiyon bir çift taraflı parametreyi değiştirdiğinde yada yerel olmayan bir değişkeni değiştirdiğinde Fonksiyonel yan etkilerdeki problem Deyimde başvurulan fonksiyon işleçlerden birini değiştirdiğinde a = 10; /* fun parametresini değiştirsin varsayalım*/ b = a + fun(a); Wesley. All rights reserved. 1-11
Fonksiyonel yan etkiler İki mümkün çözüm 1. Dil tanımını yan etkileri yapmayacak şekilde yazmak Fonksiyonlarda çift taraflı parametreye izin verilmez Fonksiyonlarda yerel dışı değişkene izin verilmez. Avantaj: Bu çalışır! Dezavantaj: çift yönlü parametre ve yerel dışı değişken kullanımı esnekliğinin ortadan kalkması 1. Dil tanımını işleç işlenme sırasının sabit şekilde yapacak şekilde yazmak. Dezavantaj: bazı derleyici optimizasyonlarının sınırlar. Wesley. All rights reserved. 1-12
Aşırı yüklenmiş operatörler(işleçler) Bir işleci birden fazla amaç için kullanmaya operatör(işleç) aşırı yüklemesi denilir( operator overloading). Bazıları yaygındır(örn., int ve float için + ) Bazıları potansiyel hatadır(örn., C ve C++ daki *) Derleyicinin hata denetimini kaybetmesi Okunabilirliğin azalması Yeni sembol eklenerek sakınılabilir(örn.,pascal daki div integer bölmede kullanılır.) Wesley. All rights reserved. 1-13
Aşırı yüklenmiş operatörler(işleçler) C++ ve Ada kullanıcı tanımlı işleç aşırı yüklemeye izin verir. Potansiyel problemler: Kullanıcılar anlamsız işleçler tanımlayabilir. İşleçler anlamlı olsalar dahi okunabilirlik gidebilir. Wesley. All rights reserved. 1-14
Tip Dönüşümleri(Type Conversions) Daraltma dönüşümü(narrowing conversion) bir nesneyi asıl halinin sığmadığı daha dar bir kalıba koyma,örn float u int e dönüştürme Genişletme dönüşümü (widening conversion) nesneyiş kendisinin tamamen sığabildiği daha büyük bir kalıba koyma örn., int -> float Wesley. All rights reserved. 1-15
Tip Dönüşümleri: Karışık Kip(Mixed Mode) Birkarışık kip deyimi(mixed-mode expression) farklı tiplerin işleçlerini(operator) içerir. Bir zorlama(coercion) dolaylı yapılan tip dönüşümüdür. Zorlamanın dezavantajları: Derleyicinin tip hatası tespiti yeteneğini azaltır. Birçok dilde, tüm sayısal tipler ifadelerde zorlamalara tabi tutulurlar, genelde genişleme dönüşümleri yapılır. Ada da, ifadelerde neredeyse hiç zorlama yoktur. Wesley. All rights reserved. 1-16
Açık Tip Dönüşümleri Açık tip dönüşümleri C gibi dillerde (Kalıba dökme)casting adlanır. Örnek C: (int) angle Ada: Float (sum) Ada nın sözdizimi fonksiyon çağrımına benzer. Wesley. All rights reserved. 1-17
Tip dönüşümleri: Deyimlerdeki hatalar Neden oldukları Aritmetikte doğal sınırlamalar örn., sıfıra bölme Bilgisayar aritmetiğinde sınırlamalar.örn. taşma(overflow) Çalışma zamanı sistemlerde sıklıkla ihmal edilirler. Wesley. All rights reserved. 1-18
İlişkisel ve Mantıksal Deyimler(Relational and Boolean Expressions) İlişkisel Deyimler Farklı tipler için ilişkisel işleç ve işlenenleri kullanma Bazı mantıksal temsillerin hesaplanması Farklı dillerde farklı semboller kullanılır.(!=, /=,.NE., <>, #) Wesley. All rights reserved. 1-19
İlişkisel ve Mantıksal Deyimler Mantıksal Deyimler İşleçler mantıksal sonuçta mantıksaldır. Örnek işleçler FORTRAN 77 FORTRAN 90 C Ada.AND. and && and.or. or or.not. not! not xor Wesley. All rights reserved. 1-20
İlişkisel ve Mantıksal Deyimler: C de mantıksal tip yoktur C de mantıksal(boolean) tip yoktur yanlış(false) için int 0 değerini kullanır ve sıfır olmayan tüm sayılar doğru(true) kabul edilir. C deyimlerindeki gariplik yasaldır: a < b < c fakat sonuç beklediğiniz gibi değildir. Sol işleç işlenir, 0 yada 1 üretir. Hesaplama sonucu dağa sonra sağdakiyle karşılaştırılır.(örn., c) Wesley. All rights reserved. 1-21
İlişkisel ve Mantıksal Deyimler: İşleç Önceliği C-temelli işleçlerdeki öncelik prefix ++, -- unary +, -, prefix ++, --,! *,/,% binary +, - <, >, <=, >= =,!= && Wesley. All rights reserved. 1-22
Kısa devre hesaplama(short Circuit Evaluation) Tüm işleçler hesaplanmadan sonucun belirlenebildiği deyimlerdir. örnek: (13*a) * (b/13 1) eğer a sınıfrsa,(b/13-1) hesaplamaya gerek yoktur. Kısa devre olmayan hesaplamadaki sorun index = 1; while (index <= length) && (LIST[index]!= value) index++; index=length olduğunda, LIST [index] indeksleme sorunu oluşturur ( LIST de length -1 eleman olduğunu varsayıyoruz) Wesley. All rights reserved. 1-23
Kısa devre hesaplama C, C++, ve Java: Mantıksal işleçler(boolean operators) (&& ve ) için kısa devre hesaplama kullanır, ayrıca kısa devre hesaplamanın yapılmadığı bitsel işleçlerede olanak verirler. (& ve ) Ada: programcılar kısa devre hesaplama yapılıp yapılmayacağına izin verebilir(kısa devre and then ile belirtilebilir veya or else) Kısa devre hesaplama deyimlerde yan etkilere yol açabilir. örn. (a > b) (b++ / 3) Wesley. All rights reserved. 1-24
Atama İfadeleri Genel sözdizimi <target_var> <assign_operator> <expression> Atama işleci = FORTRAN, BASIC, PL/I, C, C++, Java := ALGOLs, Pascal, Ada = işleci aşırı yüklenirse problem olabilir. Wesley. All rights reserved. 1-25
Atama ifadeleri: Şartlı hedefler Şartlı hedefler (C, C++, and Java) (flag)? total : subtotal = 0 bu aşağıdakiyle eşleniktir. if (flag) total = 0 else subtotal = 0 Wesley. All rights reserved. 1-26
Atama İfadeleri: Bileşik İşleçler(compound operators) Sıklıkla ihtiyaç duyulan bir deyim yerine kısa yoldur. ALGOL ile geldi; C tarafından benimsendi Örnek a = a + b şöyle yazılır a += b Wesley. All rights reserved. 1-27
Atama ifadeleri: tekil atama işleçleri C temelli dillerde tekil arttırma ve azaltma işleçleri atamalar ile kullanılabilir. Örnekler sum = ++count sum = count++ count++ -count++ Wesley. All rights reserved. 1-28
Deyim olarak atama C, C++, ve Java, da atama ifadesi bir sonuç üretir ve işlenen(operand) gibi kullanılabilir. Örnek: while ((ch = getchar())!= EOF){ } ch = getchar() yapılır; sonuç (ch ye atanır) while ifadeyi için karşılaştırma koşulu olarak kullanılır. Wesley. All rights reserved. 1-29
Karışık kipli atama Atama ifadeleri karışık kipli olabilir örneğin int a, b; float c; c = a / b; Pascal da, integer değişkenler real değişkenlere atanır, fakat real değişkenler integer lara atanmaz Java da, sadece genişletme zorlaması atamalarda yapılır. Ada da, atamada zorlama yoktur. Wesley. All rights reserved. 1-30