Makrodefinicje - problem

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..

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?

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;
    }
}

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