Standart C Programlama Dili


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

  1. C dili tarafından belirlenmiş bulunan işleçlerin öncelik ve birleşme özelliklerine, yada
  2. 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.