Tam Sürümünü Görmek İçin : Soru: Bu Kod Neden Farklı Çıktı Veriyor
Aşağıdaki kodun çıktı olarak 2 yazdırması gerekiyor ama 8 yazdırıyor. Sebebi ne olabilir ?
#include <stdio.h>
#define abc(x) (x>0 ? x : -x)
void main()
{
int a=3, b=5;
printf( "%d", abc(abc(a-b)) );
}
quasimodo
18/12/2007, 17:46
Iste bu yuzden makro kullanimini tavsiye etmezler.
abs(a - b) dediginde 3 - 5 i direk yukarida tanimladigin
makroda x yerine yazar
yani 3 - 5 > 0 olmadigina gore
-x geriye donecektir. peki -x nedir
-3 - 5 tir. Bunun sonucuda 8 dir.
soyle yaparsan duzgun calisabilir.
#define abs(x) ((x > 0) ? (x) : (-x))
Çok saol teşekkür ederim ama 3-5 i - ile çarpınca -3+5 olmuyo mu. Yoksa Makrolar - yi hiç çarpmadan direk başa mı koyuyolar.
Edit : Evet şimdi bir kaç örnek yaptım - yi direk başa koyuyomuş - nin tamamını etkilemesi için
#define abc(x) (x>0 ? x : -(x))
gibi bir kod kullanmak gerekiyor.
acehreli
21/12/2007, 19:07
O da her durumda calismayabilir. En azindan butun x'leri parantez icinde yazmak gerekebilir. Herb Sutter'in eglenceli bir yazisini cevirmistim:
http://www.ceviz.net/makrolar-neler-yapamazlar_a395.html
Ali
Yazı çok güzel. Olimpiyatlara hazırlanıyorum ve bu tür ince noktalara ihtiyacım var. Şimdi sayenizde tanıdığım bu adamın diğer yazılarını okuyacağım. Herşey için teşekkür ederim.
Herb Sutter'i arastirdiysan sayfasindaki "guru of the week" lerin kitap haline cevrilmis oldugunu gormussundur.Bunlarin turkceye cevrilmis olanlari var. "siradisi C++" ismiyle satiliyor.
Bunun disinda Scott Meyers'in effective C++ , more effective C++ ve effective STL kitaplarini da mutlaka oneririm.
kolay gelsin
Evet sıradışı C++ kitaplarını gördüm. Hatta sipariş etmeyi düşünüyorum. Şimdi söylediğin diğer kitapları da inceliyeceğim. Kaynaklar için sağol.
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.