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