08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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

Burada b değişkenine atanan değer 100 olur.<br />

Bu tür öncelik sorunlarını çözmek amacıyla makro açılım listesi dıştan öncelik ayracı içine<br />

alınmalıdır.<br />

#define Kare(x)<br />

((x) *(x))<br />

Bu kez aynı ifade önişlemci tarafından aşağıdaki gibi açılır:<br />

b = 100 / ((a) * (a));<br />

Bu kez b değişkenine atanan değer 1 olur.<br />

Makro açılım listesini dıştan ayraç içine almak ve açılım listesinde yer alan makro<br />

parametrelerinin her birini ayraç içine almak makroları güvenilir kılmaya yetmez. Zaten<br />

makrolarla ilgili en büyük sorun güvenilirlik sorunudur. Aşağıdaki kodu inceleyin:<br />

#include <br />

#define Kare(x)<br />

((x) * (x))<br />

int func(int val);<br />

int main()<br />

{<br />

int x = 10;<br />

int y = Kare(x++);<br />

int z = Kare(func(y));<br />

/*********/<br />

return 0;<br />

}<br />

y = Kare(x++);<br />

deyiminde eğer Kare bir işlev olsaydı bu işlev 10 değeri ile çağrılmış olurdu. Sonek<br />

konumundaki ++ işlecinin yan etkisi nedeniyle, x nesnesinin değeri 11 olurdu. Ancak<br />

makro önişlemci tarafından açıldığında derleyicinin göreceği kod<br />

y = ((x++) * (x++));<br />

biçiminde olur ki, bu durum "tanımsız davranıştır" (undefined behaviour).<br />

z = Kare(func(y));<br />

deyimini de önişlemci aşağıdaki gibi açar:<br />

z = ((func(y)) * (func(y)));<br />

Derlenen kod, func işlevinin iki kez çağrılmasına neden olur. Oysa Kare bir işlev olsaydı,<br />

çağrılan func işlevinin üreteceği geri dönüş değeri, bu kez Kare işlevine argüman olarak<br />

gönderilmiş olurdu.<br />

Örnek Makrolar<br />

Aşağıda bazı faydalı makro tanımlamalarına örnekler verilmiştir. Örnekleri inceleyin:<br />

#define GETRANDOM(min, max) ((rand()%(int)(((max) + 1)-(min)))+ (min))<br />

#define ISLEAP(y) ((y) % 4 == 0 && (y) % 100 != 0 || (y) % 400 == 0)<br />

#define SWAPINT(x, y) ((x) ^= (y) ^= (x) ^= (y))<br />

#define XOR(x, y) (!(x) ^ !(y))<br />

488

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

Saved successfully!

Ooh no, something went wrong!