Önceki bölümlerde incelediğimiz üzere operatörler cast operatörü, sizeof, adresini elde etme (&), adresi verilen veriye erişme (*), negatifini alma (–), pozitifini alma (+), bit düzeyinde tamamlayıcısını elde etme (∼), lojik olarak karşıtını alma (!), artım (++) ve azaltım (––) operatörleridir.
Bu başlık altında bunlardan negatifini alma (–), pozitifini alma (+), artım (++) ve azaltım (––) operatörlerini inceleyeceğiz.
Negatifini alma operatörü (–) tek bir operand üzerinde etkili olduğu için, iki operand ile işleme giren (–) sembolü ile karıştırılmamalıdır.
ÖRNEK:
#import <Foundation/Foundation.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
int x,y = -5;
x=16- -y;
NSLog(@"\nx=%i\n\n",x);
[pool drain];
return 0;
}
Bu programda x’in değeri 11 olarak bulunacaktır. –y, –(–5)=+5 olarak hesaplanır. 16’yı izleyen çıkarma operatörü (–) ile y’nin önündeki negatifini alma (–) operatörü arasında mutlaka bir boşluk olmalıdır. Aksi halde – ifadesi azaltım operatörü olarak algılanacaktır.
Operatör |
Sembolü |
Kullanılışı |
İşlem Sonucu |
---|---|---|---|
Tekli negatif alma |
– |
–a |
a’nın negatifini alır |
Son artım |
++ |
a++ |
Önce a’nın değerini al, kullan, sonra 1 artır. |
Ön artım |
++ |
++a |
Önce a’nın değerini 1 artır, sonra kullan. |
Son azaltım |
–– |
a–– |
Önce a’nın değerini al, kullan, sonra 1 azalt. |
Ön azaltım |
–– |
––a |
Önce a’nın değerini 1 azalt, sonra kullan. |
Son artım ve son azaltım operatörlerinde derleyici, değişkenin o andaki değerini bellekte geçici bir değişkene atayarak saklar. Sonra değişkenin değerini 1 artırır (son artım) veya 1 azaltır (son azaltım). Geçici değişkendeki değer ise, ifade içinde kullanılır.
ÖRNEK:
#import <Foundation/Foundation.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
int x=4, y=8, z;
z= x++ + y--;
NSLog(@"\nz= %i ..\n",z);
NSLog(@"\nx= %i ..\n",x);
NSLog(@"\ny= %i..\n",y);
[pool drain];
return 0;
}
PROGRAMIN ÇIKTISI:
z=12
x=5
y=7
Önce x ve y’nin o andaki değerleri geçici bellek alanlarına atanmış (4 ve 8), bu değerlerle ifade hesaplanmış (z=12) sonra x’in değeri 1 arttırılmış ve y’nin değeri 1 azaltılmıştır.
Ifadeyi z= x+++y–– ; şeklinde boşluksuz yazsak da sonuç değişmezdi. Derleyici bu durumda +++’nın mevcut operatörler içinde mümkün olan en uzununu (++) alır ve ifadeyi şu şekilde yorumlardı:
z=(x++) + y–– ;
Aynı ifadeyi z=x+++ veya y--- şeklinde yazsak da aynı sonucu elde ederdik.
Ön artım ve ön azaltım operatörleri kullanıldığında ise, önce artım (mevcut değere 1 ekleme) veya azaltım (mevcut değerden 1 çıkarma) gerçekleştirilir, sonra ifade hesaplanır.
ÖRNEK:
#import <Foundation/Foundation.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
int x,y,z,m;
x=10;
y=5;
z=16;
m= ++x - --y + z++;
NSLog(@"\nx = .. %i \n",x);
NSLog(@"\ny = .. %i \n",y);
NSLog(@"\nz = .. %i \n",z);
NSLog(@"\nm = .. %i \n",m);
[pool drain];
return 0;
}
PROGRAMIN ÇIKTISI:
Bu programda m ifadesini
m= ++x–––y + z++ ;
şeklinde yazmış olsaydık, derleyici tarafından (kullanılan derleyiciye göre);
Lvalue required in function main ()
veya,
error C2105: '++' needs l–value
hata mesajını alırdık. Bunun anlamı şudur: İfade; m=++x–– –y + z++ şeklinde yorumlanmış. ++x–– ifadesi ise sağdan sola birleşim özelliğine sahip olduğu için (bkz.öncelikler ve birleşimler tablosu) ++(x––) şeklinde yorumlanır. x–– işleminin nasıl yapılacağını hatırlayalım. Önce x’in bir kopyası geçici bir bellek alanına yerleştirilir. Sonra değeri 1 azaltılır. Geçici bellek alanına yüklenen değer için ++ operatörü geçersizdir. Çünkü ++ ve –– operatörleri sadece sürekli saklanan değişkenler (left hand value, Lvalue, = sembolünün solundaki değişken) için geçerli olduğundan bu hata mesajı alınmıştır.
Aşağıdaki programda ise artım ve azaltım operatörlerinin değişik kullanım biçimleri örneklenmiştir:
#import <Foundation/Foundation.h>
int main(int argc, char* argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
int m,n,p,q;
m=4; n=2; p=10; q=8;
m= -m++ ;
n= n-- ;
p= --p ;
q= -++q ;
NSLog(@"\nm = %i \n",m);
NSLog(@"\nn = %i \n",n);
NSLog(@"\np = %i \n",p);
NSLog(@"\nq = %i \n",q);
[pool drain];
return 0;
}
SONUÇ: