C’de Arttırma ve Azaltma Operatörleri

Bir önceki yazıda bahsettiğimiz ve C’de çeşitli kısaltılmış yazımlara izin veren operatörler gerçekten zamanı geldiğinde oldukça kullanışlı olmaktadır. Bu operatörler C’de hayati bir öneme sahip değildirler. Yani bu operatörler olmadan da kodlarınızı yazabilirsiniz. Ancak olay sadece kod yazmak değildir. Temiz kod yazmadan tutun da kodun okunabilirliğine kadar gerçek dünyada pek çok mesele vardır. Özellikle birden fazla yazılımcı ile iş yaparken bu konular hayati duruma gelir. Bu nedenle C geliştiricileri bu gibi kısaltmaların önemli olduğunu düşünüp bu operatörleri dile eklemişlerdir.

Yine bir önceki yazıda toplamalı atama operatörü olan “+=” ve çıkarmalı atama operatörü olan “-=” operatörlerini gördük. Bu operatörler ile değişkenlerin değerlerini belli miktarlarda arrttırıp azaltabiliyorduk. C geliştiricileri yine önemli bir konuyu göz önünde bulundurup bunun gibi operatörlerin kullanımında aslında değişkenleri 1 arttırma ve 1 azaltma işlemlerini daha sık yaptığımızı farketmişlerdir. Örneğin 2 önceki yazıda yer alan sayac değişkenini hatırlayalım:

sayac = sayac + 1;

İşte bunun gibi değişkenler ile C programlarında sıklıkla karşılaşılır. Bunu bir önceki yazıda gördüğümüz birleşik atama operatörü ile şu şekilde kısaltmıştık:

sayac += 1;

İşte burada aslında bunu çok daha kısa bir biçimde nasıl yazabileceğimizi göreceğiz. C’de “++” ile belirtilen arttırma operatörü (incerement operator) ve “—” ile belirtilen azaltma operatörü (decrement operator) isimli iki operatör bulunmaktadır. Bu operatörler basitçe bir değişkenin değerini bir arttırma ve bir azaltma işlemini gerçekleştirirler. Örneğin yukarıdaki sayac değişkenini 1 arttırma işlemini bu operatörler ile şu şekilde yapabiliriz:

sayac++;

Bu operatörlerin değişkenin neresinde (başında veya sonunda) kullanıldığı önemli bir konudur. Yukarıdaki kodu şu şekilde de yazabilirdik:

++sayac;

Fakat bu tek satırlık ifade bir önceki ifade ile aynı işi yapacaktı. Bu operatörlerin kullanım yerleri aslında kendini çeşitli birleşik ifadelerin içerisinde kullanılırken hissettirir. Örneğin değeri 15 olan sayi isimli bir değişkeni bu operatör ile şu şekilde kullanıp bir başka değişkene atama yaptığımızı düşünelim:

int sonuc = sayi++;

Bu durumda sonuc değişkeninin deeğri ne olur? Geldik en can alıcı konulardan birine… Bu operatörler birçok programlama dilinin sertifika programları, olimpiyatlar gibi yerlerde çıkan sorularda sıkça karşımıza çıkmaktadır. Amaç aslında kullanıcının dikkatini ölçmektir. C ile pek çok program yazmış bir kişi bile bu operatörün kullanıldığı yerlerde hataya düşebilmektedir. Yukarıdaki kod parçasında sonuc değişkeninin değeri yine 15 olur. Fakat sayi değişkeninin değeri 1 artarak 16 olur. Biz bunun yerine şöyle bir kod yazmış olsaydık:

int sonuc = ++sayi;

Bu durumda işler biraz farklı olacaktı. Bu kod satırı çalıştıktan sonra sonuc ve sayi değişkenlerinin değerleri 16 olacaktır. Bunun sebebi tamamen operatörün kullanım yeri ile alakalıdır. Operatör nerede kullanılırsa kullanılsın, üzerinde kullanıldığı değişkenin değerini her zaman 1 arttırsa da bu değişkenin etkilediği diğer değişkenlerde farklı bir sonuç ortaya çıkarabilmektedir.

Bir ifadenin içerisinde arttırma ve azaltma operatörleri kullanıldığında, eğer bu operatörler değişkenin başında yer alıyorsa önce bu değişkenin değeri 1 arttırılır veya azaltılır, daha sonra da yeni değer ifadede kullanılır (veya yukarıdaki gibi atama yapılır). Eğer değişkenin sonunda yer alıyorlarsa önce değişkenin değeri ifade içerisinde kullanılır, daha sonra arttırma ve azaltma işlemi gerçekleştirilir.

Arttırma operatörü olan “++” operatörü bir değişkenin başında (prefix) yer alıyorsa ona önceden arttırma operatörü (preincrement operator) adı verilirken, değişkenin sonunda (postfix) yer alıyorsa sonradan arttırma operatörü (postincrement operator) adı verilir. Yine azaltma operatörü olan “—” operatörü bir değişkenin başında (prefix) yer alıyorsa ona önceden azaltma operatörü (predecrement operator) adı verilirken, değişkenin sonunda (postfix) yer alıyorsa sonradan azaltma operatörü (postdecrement operator) adı verilir. Arttırma ve azaltma operatörlerinin kullanım örnekleri ve kullanım yerlerine göre anlamları şöyle özetlenebilir:

Operatör Örnek İfade Açıklama
++ ++a Önce a değişkenini 1 arttır, daha sonra onun değerini ifade içinde kullan.
++ a++ Önce a değişkeninin değerini ifade içinde kullan, daha sonra onun değerini 1 arttır.
— –a Önce a değişkenini 1 azalt, daha sonra onun değerini ifade içinde kullan.
— a– Önce a değişkeninin değerini ifade içinde kullan, daha sonra onun değerini 1 azalt.

Görüldüğü gibi “++” ve “—” operatörleri 2 varyasyonu olan tek terimli (unary) operatörlerdir. Bu operatörlerde “+” veya “-” karakterlerinin arasına boşluk koymak geçersizdir. Operatör ile değişken arasında boşluklar olabilir. Ancak bu iyi ve okunaklı bir kodda olması gereken bir olay değildir. Zaten kullanım yerine göre oldukça kafa karıştırıcı olabilen bu operatöre bir de boşluklar ile daha fazla karmaşıklık eklemek anlamsızdır. Şimdi hemen bu operatörler ile ilgili bir örnek yapalım.

// Code 3.7.1: Code3_7_1.c
// Arttırma ve azaltma operatörleri örneği

#include <stdio.h>

int main()
{
	int a = 3;
	int b = 4;
	int c = 5;
    
	printf("%d\n", a);
	printf("%d\n", a++);
	printf("%d\n\n", ++a);

	printf("%d\n", b);
	printf("%d\n", --b);
	printf("%d\n", b--);
	printf("%d\n\n", b);

	printf("%d\n", c);
	printf("%d\n", (c++));
	printf("%d\n", (c--));
	printf("%d\n\n", c);

	return 0;
}
ÇIKTI
3
3
5

4
3
3
2

5
5
6
5

Şimdi burada öncelikle değişkenlerimize ilk değer verilip tanımlamalar yapılmıştır. Daha sonra a değişkeni olduğu gibi ekrana basılmıştır. 13. satırda yine a değişkeninin önceki değerinin çıktı olarak basıldığını görmekteyiz. Bunun nedeni a değişkeninin değerinin önce kullanılıp daha sonra 1 arttırılmasıdır. Bu satırdan sonra a değişkeninin değeri 4 olur. 14. satırda bu sefer önce arttırma sonra kullanma yapıyoruz. Bu durumda önce a değişkeninin değeri 5 olur ve daha sonra ekrana basılır.

16. satırda yine basit bir değer basma görüyoruz. 17. satırda önce b değişkeninin değeri 1 azaltılarak 3 yapılır, daha sonra bu değer ekrana basılır. 18. satırda ise değeri 3 olan b değişkeninin değeri ekrana basılır ve daha sonra 1 azaltılarak 2 yapılır. Bu durumu yine 19. satırda b değişkenini ekrana bastırarak görebilirsiniz.

22. satırda parantezin bir şeyi etkileyip etkilemediği test edilmiştir. Görüldüğü gibi ilk değeri 5 olan c değişkeninin önce değeri ekrana basılmış, daha sonra da değeri 1 arttırılarak 6 yapılmıştır. Yine 23. satırda önce 6 değeri ekrana basılmış, daha sonra da c değişkeninin değeri 1 azaltılarak 5 yapılmıştır. Bu sonucu da 24. satırda ekrana basılan değer ile görebilirsiniz.

İfade içinde kullanımları bu operatörleri oldukça değiştirse de normal bir deyimde bu operatörlerin değişkenin başında veya sonunda kullanılmasının bir önemi olmadığını söylemiştik. Aşağıdaki tüm kod parçaları aynı işi yapmaktadır:

sayi1 = sayi1 + 1;
sayi2 = sayi2 – 1;
sayi1 += 1;
sayi2 -= 1;
sayi1++;
sayi2--;
++sayi1;
--sayi2;

Bu arada bu operatörleri basit bir değişken ismi yerine bir ifadeye vermeye çalışırsanız hata ile karşılaşırsınız. Örneğin:

++(a + 1)

Yukarıdaki kod parçasında normalde önce a değişkeninin değerinin 1 arttırılıp daha sonra bir kez daha 1 arttırılmasını beklersiniz. Ancak bu iş bu şekilde çalışmaz. Böyle bir kodda derleyiciniz size sözdizimi hatası (syntax error) döndürecektir. Bu nedenle bu opertörleri direk bir değişkenin yanında kulllanmaya dikkat edin.

Son olarak şu ana kadar gördüğümüz tüm C operatörlerinin birbirlerine göre öncelik sırasını (precedence) ve öncelik yönünü (associativity) bir tabloda listeleyelim:

Operatör Önceliği (Precedence) Operatör Tanım Öncelik Yönü (Associativity)
1 () Parantez Operatörü Soldan Sağa
++ Sonradan Arttırma Operatörü
— Sonradan Azaltma Operatörü
2 ++ Önceden Arttırma Operatörü Sağdan Sola
— Önceden Azaltma Operatörü
+ Artı Operatörü
– Eksi Operatörü
! Mantıksal DEĞİL Operatörü
(tür) Tür Dönüştürme Operatörü
sizeof sizeof Operatörü
3 * Çarpma Operatörü Soldan Sağa
/ Bölme Operatörü
% Mod Alma Operatörü
4 + Toplama Operatörü Soldan Sağa
– Çıkarma Operatörü
5 < İlişkisel Küçüktür Operatörü Soldan Sağa
<= İlişkisel Küçük Eşittir Operatörü
> İlişkisel Büyüktür Operatörü
>= İlişkisel Büyük Eşittir Operatörü
6 == Eşitlik Operatörü Soldan Sağa
!= Eşitsizlik Operatörü
7 && Mantıksal VE Operatörü Soldan Sağa
8 || Mantıksal VEYA Operatörü Soldan Sağa
9 ?: Koşul Operatörü Sağdan Sola
10 = Atama Operatörü Sağdan Sola
+= Toplamalı Atama Operatörü
-= Çıkarmalı Atama Operatörü
*= Çarpmalı Atama Operatörü
/= Bölmeli Atama Operatörü
%= Mod Almalı Atama Operatörü
11 , Virgül Operatörü Soldan Sağa

Şu ana kadar C’deki tüm operatörlerin yaklaşık %65’ini gördük. Bir sonraki bölümde de C’deki anahtar kelimelerin pek çoğunu görmüş olacağız. Aslında bunlar dilin temel söz dizimini oluşturmaktadır ve bunları kullarak pek çok program yazabilirsiniz. Fakat sadece sözdizimi bilmek yetmez. Daha fazla program yazma tekniği ve algoritmik düşünme yeteneği kazanmanız gerekir. Bunu da bolca örnek yaparak ve yeni şeyler öğrenerek sağlayabilirsiniz. C dilinin esas gücü olan göstericilere girdiğimizde biraz ter dökecek, ancak karşılığını da fazlasıyla alacağız.

4.8 8 votes
Article Rating
Subscribe
Bildir
guest

3 Yorum
Eskiler
En Yeniler Beğenilenler
emir

begendim

Arif

Hocam bu tarz sorular nasıl çözülür
intx=10
x=–x+x++—x+x–

Last edited 3 yıl önce by Arif