PDA

Tam Sürümünü Görmek İçin : Soru: Bu Kod Neden Farklı Çıktı Veriyor


Pwm
18/12/2007, 17:38
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))

Pwm
18/12/2007, 17:50
Ç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

Pwm
21/12/2007, 19:22
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.

ceeyt
22/12/2007, 01:04
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

Pwm
22/12/2007, 15:05
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.