Makrodefinicje - problem

2011-10-13 15:46
Dr Zielu
0

Witam, bawiłem się dzisiaj makrodefinicjami w C++ i natrafiłem na pewien ciekawy i irytujący mnie problem. Wiem jak go rozwiązać, natomiast nie mam pojęcia dlaczego tak się dzieje i prosiłbym o wyjaśnienie tego.

Oto kod z makrodefinicją:

#include <iostream>
#define CZYNNIK(a,b) (   (a) /( (a)+(b) )  )
using namespace std;

int main()
{
    int d = 0;
    while(d<10)
    {

        cout << "Czynnik = " << CZYNNIK(d,2.0);
        cout << ", dla d =" << d << endl;
    }
}

Pętla powinna wykonać się 10 razy a wykonuje się 5...dlaczego? Jaki jest błąd w tej makrodefinicji? Rozwiązałem to na dwa sposoby i działa:

#include <iostream>
#define CZYNNIK(a,b) (   (a) /( (a)+(b) )  )
using namespace std;

int main()
{
    int d = 0;
    while(d<10)
    {
        ++d;
        cout << "Czynnik = " << CZYNNIK(d,2.0);
        cout << ", dla d =" << d << endl;
    }
}

Daje taki sam rezultat jak po prostu funkcja inline:

#include <iostream>
using namespace std;

inline void CZYNNIK (double a, double b)
{
    //(a/(a+b));
}

int main()
{
    int d = 0;
    while(d<10)
    {
        ++d;
        cout << "Czynnik = " << CZYNNIK(d,2.0);
        cout << ", dla d =" << d << endl;
    }
}

Bardzo bym prosił o wyjaśnienie, dlaczego się tak dzieje.
Wiem, że makrodefinicji nie powinno się używać ale w ramach ćwiczeń i edukacji, chciałbym to zrozumieć.

EDIT!
W trzecim przykładzie kod:

#include <iostream>
using namespace std;

inline void CZYNNIK (double a, double b)
{
    //(a/(a+b));
}

int main()
{
    int d = 0;
    while(d<10)
    {

        cout << "Czynnik = " << CZYNNIK(d,2.0);
        cout << ", dla d =" << d << endl;
    }
}

Bez tego ++d...!!

#include <iostream>
using namespace std;

inline void CZYNNIK (double a, double b)
{
    //(a/(a+b));
}

int main()
{
    int d = 0;
    while(d<10)
    {
        ++d;
        cout << "Czynnik = " << CZYNNIK(++d,2.0);
        cout << ", dla d =" << d << endl;
    }
}

Pomyliłem się przepraszam. Ten kod jest rozwiązaniem drugim..

edytowany 1x, ostatnio: madmike, 2016-12-13 18:26

Pozostało 580 znaków

2011-10-13 20:36
0

Jeśli wezmę pierwszy przykład, który podałeś, to jest to niekończąca się pętla. Zmienna d nigdy nie jest inkrementowana. Możesz sprawdzić, czy ten przykład jest poprawny?

Pozostało 580 znaków

2011-10-14 13:30
0

Jeśli chodziło ci o:

#include <iostream>
#define CZYNNIK(a,b) (   (a) /( (a)+(b) )  )
using namespace std;

int main()
{
    int d = 0;
    while(d<10)
    {

        cout << "Czynnik = " << CZYNNIK(d++,2.0); // albo CZYNNIK(++d,2.0);
        cout << ", dla d =" << d << endl;
    }
}

to sobie po prostu podstaw:

#include <iostream>
using namespace std;

int main()
{
    int d = 0;
    while(d<10)
    {

        cout << "Czynnik = " << ((d++) / ((d++) + (2.0))); // albo ((++d) / ((++d) + (2.0)));
        cout << ", dla d =" << d << endl;
    }
}
edytowany 2x, ostatnio: iooi, 2011-10-14 13:31

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0