You are on page 1of 30

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)
Copyright © 2007 Addison-
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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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)

Copyright © 2007 Addison-


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

Copyright © 2007 Addison-


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)
– *, /
– +, -

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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);

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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.)

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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., <>, #)

Copyright © 2007 Addison-


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

Copyright © 2007 Addison-


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)

Copyright © 2007 Addison-


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 +, -
<, >, <=, >=
=, !=
&&
||

Copyright © 2007 Addison-


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)

Copyright © 2007 Addison-


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)
Copyright © 2007 Addison-
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.

Copyright © 2007 Addison-


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

Copyright © 2007 Addison-


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
Copyright © 2007 Addison-
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++

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


Wesley. All rights reserved. 1-30

You might also like