08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

köşeli ayraç işlecine terim olduğunda, ulaşılan nesneye atama yapılamaz. Aşağıdaki<br />

örneği inceleyin:<br />

char *get_name();<br />

const char *get_fname();<br />

int main()<br />

{<br />

*get_name() = 'a';<br />

get_name()[2] = 'x';<br />

*get_fname() = 'a'; /* Geçersiz */<br />

get_fname()[2] = 'x'; /* Geçersiz */<br />

}<br />

return 0;<br />

Yukarıda main işlevi içinde çağrılan get_name() işlevinin geri döndürdüğü adresteki<br />

nesneye 'a' değeri atanıyor. Yine get_name()[2] ifadesi ile işlevin döndürdüğü adresteki<br />

nesneden iki sonraki nesneye ulaşılarak bu nesneye de 'x' değeri atanıyor. Atamalar<br />

geçerlidir. Ancak geri dönüş değeri const char * türden olan get_fname işlevi için benzer<br />

atamalar geçersizdir, derleme zamanında hata oluşturur.<br />

volatile Belirleyicisi<br />

Derleyiciler eniyileme amacıyla nesneleri geçici olarak yazmaçlarda tutabilir.<br />

Yazmaçlardaki bu çeşit geçici barınmalar register belirleyicisi kullanılmasa da derleyiciler<br />

tarafından yapılabilir. Örneğin:<br />

int kare (int a)<br />

{<br />

int b;<br />

}<br />

b = a * a;<br />

return b;<br />

Yukarıdaki işlevde b geçici bir değişkendir, dolayısıyla derleyici b değişkenini bellekte bir<br />

yerde saklayacağına, geçici olarak yazmaçlarından birinde saklasa da işlevsel bir farklılık<br />

ortaya çıkmaz. Bu çeşit uygulamalarda derleyicinin değişkenleri geçici olarak yazmaçlarda<br />

saklaması işlemleri hızlandırır. Aşağıdaki kodu inceleyin:<br />

int a;<br />

int b;<br />

/***/<br />

a = b;<br />

if (a == b) {<br />

/***/<br />

}<br />

Bu örnekte doğal olarak ilk adımda b değişkeni a değişkenine aktarılmak üzere<br />

yazmaçlardan birine çekilir. Ancak derleyici if ayracı içindeki ifadede a == b<br />

karşılaştırmasını yapmak için bellekteki b yerine yazmaçtaki b'yi kullanabilir. Verdiğimiz<br />

iki örnekte de derleyici bir takım eniyileme işlemleriyle programı işlevi değişmeyecek<br />

biçimde daha hızlı çalışır hale getirmek istemiştir. Ancak kimi uygulamalarda derleyicinin<br />

bu biçimde davranması hatalara neden olabilir. İkinci örnekte :<br />

356

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!