1.5. İşleçler, İfadeler Ve Atama Deyimleri
C dili, sağladığı işleçler (işlem operatörleri) açısından çok zengindir. İşletilebilir C deyimlerinin çoğu bir ifade şeklinde yazılır. Bu ifade belirli kurallara uygun olarak oluşturulmuş bir işlenenler ve işleçler karışımıdır. Diğer programlama dillerine karşılık, C dilinde bir atama bile özel bir çeşit ifadedir.
Bir ifade içinde, bir işlenen ya bir değişmez, ya bir değişkenin kullanılması, ya bir fonksiyon çağrısı yada başka bir (alt)ifade şeklinde karşımıza çıkar. İşleçler (işlem operatörleri), aritmetik işlemler, atama, bağıntısal ve mantıksal karşılaştırmalar, bit işlemleri, adreslerle ilgili işlemler ve başka işlerde kullanılırlar. C’de kullanılan aritmetik işleçler ve anlamları liste şeklinde aşağıda verilmiştir:
İşleç | Anlamı |
---|---|
+ | toplama veya tekli artı |
- | çıkarma veya olumsuzlama |
* | çarpma |
/ | bölme |
% | kalan (5%2 ifadesinin
değeri, 5/2 ’den arta kalan, yani 1 ’dir.
İşlenenler olumlu tamsayılar olmalıdır.) |
++ | anlamı, işlecin, işlenenin önünde (önek) veya arkasında (sonek) olmasına bağlı olarak değişir; ancak sonuçta işlenenin değeri bir artırılır |
-- | anlamı, işlecin, işlenenin önünde (önek) veya arkasında (sonek) olmasına bağlı olarak değişir; ancak sonuçta işlenenin değeri bir azaltılır |
Basit bir atama deyimi şu şekildedir:
değişken = ifade;
ve ifadenin değerinin hesaplandıktan sonra, değişkenin değerinin buna eşitleneceği anlamına gelir. İfadeden sonraki noktalı virgüle dikkat edin. Bu noktalı virgül deyimi sonuçlandırır.
İşte bazı örnekler. Son iki örneğin, aynı anlamı taşıdığına dikkat edin.
a = b + 10; c = d + c * e - f / g + h % j; x = y * sin(z - 3.14); z = u[2] * u[0]; u[1] = -123.45; x = 10; (x) = 10;
C dilinde, diğer bazı programlama dillerinden farkı olarak, atamanın kendisi de bir ifadedir; bundan dolayı bir değere sahiptir. Bir atama ifadesinin değeri, değeri hesaplanarak sol taraftaki değişkene atanan ifadenin değeridir. Atama ifadesinin tipi ise soldaki işlenenin tipiyle aynıdır. Bu olgu, C dilinde çok kullanılır. Örneğin, bir ifadenin değeri aynı anda birden fazla değişkene, şu şekilde, atanabilir:
a = b = c = 0;
c değişkeni 0
’ın değerini,
b
c
’nin değerini ve a
b
’nin değerini alır; böylece bütün değişkenler
0
’a eşitlenir.
Aşağıda ++
ve --
işleçlerini açıklamak için bazı
örnekler verilmiştir:
x = y++; | y ’nin değeri önce
x ’e atanır, sonra da bir artırılır. Bu şuna eşdeğerdir:
x = y; y = y+1; |
x = ++y; | y ’nin değeri önce bir
artırılır, sonra da x ’e atanır. Bu şuna eşdeğerdir:
y = y+1; x = y; |
x = y--; | y ’nin değeri önce
x ’e atanır, sonra da bir azaltılır. Bu şuna eşdeğerdir:
x = y; y = y-1; |
x = --y; | y ’nin değeri önce bir
azaltılır, sonra da x ’e atanır. Bu şuna eşdeğerdir:
y = y-1; x = y; |
Yukarıdaki örneklerde tek bir atama deyimi ile iki değişkenin değerinin
değiştirildiğine dikkat edin. ++
ve --
işleçleri
yan etkisi olan işleçlerdir, çünkü
tek bir atama deyimi ile birden fazla değişkenin değeri değiştirilebilir.
Programcıların bu işleçleri karmaşık ifadeler içinde kullanmaları uygun
değildir, çünkü böyle bir kullanım nispeten daha zor anlaşılabilir ve hataların
daha zor düzeltildiği programların ortaya çıkmasına neden olur.
Basit atama işleci (=
) dışında, atamayı aritmetik işlemlerle
birleştiren atama işleçleri de vardır. Bunlar +=
, -=
,
*=
, /=
ve %=
’dır. İşte bazı
örnekler:
x += y; | x ’e y
eklenir, bu da
x = x + (y); anlamına gelir. |
x -= y; | x ’ten y
çıkarılır, bu da
x = x - (y); anlamına gelir. |
x *= y; | x y ile
çarpılır, bu da
x = x * (y); anlamına gelir. |
x /= y; | x y ’ye
bölünür, bu da
x = x / (y); anlamına gelir. |
x %= y; | x ’e
x ’in y ’e bölümünden arta kalan atanır,
bu da x = x % (y); anlamına gelir. |
Tabii ki, yukarıdaki deyimlerin herhangi birinde y
değişkeninin
yerine genel bir ifade konulabilir. Sol taraftaki x
değişkeni
yerine de bellekteki belli bir konuma karşılık gelen daha karmaşık bir ifade
konulabilir; örneğin u[a+b]
. Bu durumda bu ifade bir kez
hesaplanır. Örneğin, u[i++] += x++;
deyimi
u[i] = u[i] + x++; i++;
anlamına gelir.
Diğer bazı işlemlerle atamayı birleştiren atama işleçleri daha sonraki bölümlerde tartışılacaktır.
Öncelik Ve Birleşme Kuralları
Bir ifade içinde, işleçlerin işlenenleri ya
- C dili tarafından belirlenmiş bulunan işleçlerin öncelik ve birleşme özelliklerine, yada
- işlenen ifadelerini parantez içine alarak
belirlenir.
Parantezler, bir işlecin işlenenlerini, o işlecin önceliğine bağlı olmadan belirtmek veya işleçlerin işlenenlerini daha açıklayıcı olacak şekilde yazmak için kullanılırlar. İkinci neden kolayca anlaşılır ifadeler yazmak için önemlidir, çünkü C dilinde öncelik ve birleşme özellikleri kolayca anımsanamayacak kadar çok işleç bulunmaktadır.
Örneğin
a = b + c * d
ifadesinde işleçler ve işlenenler şöyledir:
İşleç | İşlenenler |
---|---|
* | c ve d |
+ | b ve
(c * d) ’nin değeri |
= | a ve
(b + (c * d)) ’nin değeri |
Eğer ifade
a = b + (c * d)
şeklinde yazılırsa, işlenenler aynıdır, ancak parantezler işleçlerin işlenenlerini daha açık hale getirirler.
Fakat, ifade
a = (b + c) * d
şeklinde yazılırsa, işleçler ve işlenenler şöyle olur:
İşleç | İşlenenler |
---|---|
+ | b ve c |
* | (b + c) ’nin değeri
ve d |
= | a ve
((b + c) * d) ’nin değeri |
Yukarıdaki örneklerden de görülebileceği gibi, bir işlecin öncelik düzeyi işleçlere atanacak olan işlenenlerin sırasını belirlemeye yarar. Daha yüksek önceliği olan bir işlecin işlenenleri daha düşük olan bir işleçten önce atanacaktır. Eğer işleçlerin öncelik düzeyleri aynıysa, o zaman birleşme kuralı işlenenlerin soldan sağa mı yoksa sağdan sola mı atanacağını belirtir. Aşağıdaki çizelgede, şimdiye kadar anlatılmış bulunan işleçlerin öncelik düzeyleri ve birleşme özellikleri verilmiştir:
İşleç | Öncelik | Birleşme | |
---|---|---|---|
indisleme, fonksiyon çağırma, tekli sonekler |
[] ,() ,++ , -- |
en yüksek | → |
tekli önekler | + , - , ++ , -- |
: | ← |
çarpma | * , / , % |
: | → |
toplama | + , - |
: | → |
atama | = , += , vs. |
en düşük | ← |
Burada, ←
sağdan sola ve
→
soldan sağa birleşmeyi gösterir. Örneğin
a/b/c
ile (a/b)/c
aynı anlama gelir
ve
a=b=c
ile a=(b=c)
aynı anlama gelir.
Bir başka örnek olarak
c = d + c * e - f / g + h % j
ifadesi
c = (((d + (c * e)) - (f / g)) + (h % j))
şeklinde, işleçlerin işlenenlerini ve ifadenin anlamını değiştirmeden, parantezlenebilir.
Dikkat: Bir işlecin işlenenlerinden hangisinin önce hesaplanacağının belirtilmemiş olduğuna dikkat edin. Örneğin
a = ++b - b
ifadesinin değeri, derleyiciye bağlı olarak,
ya 0
yada 1
olabilir; bu yüzden bu tür, yan
etkisi olan, ifadelerden kaçınılması gerekir. Derleyiciler bu tür
sonucu belirli olmayan ifade kullanımları için uyarı mesajları verirler;
bu mesajları mutlaka dikkate alın. Ayrıca, +
ve
*
gibi, birleşme ve değişme özelliği gösteren işleçlerde,
parantezlerin bulunmasına rağmen, birleşme kuralı bazı derleyiciler tarafından
dikkate alınmayabilir.
Değişmez İfadeler
Bazı işleçler—örneğin, atama ve ++
ile --
işleçleri dışında, şimdiye kadar öğrenmiş olduğumuz işleçler—değişmezlere
(veya değişmez ifadelere) uygulandıklarında
değişmez ifadeler
oluştururlar. Değişmez ifadelerin avantajı derleme
sırasında hesaplanabilmeleridir. Derleyici değişmez ifadenin değerini
hesaplayıp yerine değişmez değeri koyar. Değişmez ifadeler bir değişmezin
beklendiği yerlerde kullanılabilirler. Örneğin, dizi boyları değişmez
olmalıdır, bu durumda
int a[MAXL*5+4];
tanımı, eğer MAXL
önişlemci tarafından
(#define
ile) tanımlanmış bir değişmez ise kabul
edilebilecek, fakat eğer MAXL
bir değişken ise reddedilecektir.
Programın anlaşılabilirliğini geliştirebileceği için değişmez ifadelerin
kullanımından kaçınmamak gerekir.