kolejność wywoływania metod

0
class Funkcja
{
public:
	double x;
public:
	Funkcja();
	Funkcja* Funkcja::setX(double x);
	double getX();
	virtual double oblicz();
	virtual ~Funkcja();
};
Funkcja* Funkcja::setX(double x)
{
	this->x = x;
	return this;
}

double Funkcja::getX()
{
	return x;
}



double Funkcja::oblicz()
{
	return x;
}

class FunkcjaLiniowa :
	public Funkcja
{
private:
	double a;
	double b;
public:
	FunkcjaLiniowa(double a, double b);
	virtual double oblicz();
	FunkcjaLiniowa();
	~FunkcjaLiniowa();
};


double bisekcja(FunkcjaLiniowa* ob, double p, double k, double d);
FunkcjaLiniowa::FunkcjaLiniowa(double a, double b):a(a),b(b)
{
}

double FunkcjaLiniowa::oblicz()
{
	return a*x+b;
}

 double bisekcja(FunkcjaLiniowa* ob, double p, double k, double d) {
	double x1;
	if ( (  (ob->setX(p)->oblicz())*(ob->setX(k)->oblicz())  ) > 0)
	{
		std::cout << (ob->setX(k)->oblicz())*(ob->setX(p)->oblicz()) << "zwroc cokolwiek";
		return 0;
	}
	while (abs(p - k) > d) {

		x1 = (p + k) / 2;


		if (ob->setX(x1)->oblicz() == 0) // jeżeli znaleźliśmy miejsce zerowe
			break;
		else if ((ob->setX(x1)->oblicz()) * (ob->setX(p)->oblicz()) < 0)
			k = x1; // nadpisywanie prawego krańca przedziału
		else
			p = x1; // nadpisywanie lewego krańca przedziału
	}

	return x1;
}

Zastanawia mnie dlaczego gdy piszę std::cout << (ob->setX(k)->oblicz())*(ob->setX(p)->oblicz()) to zwraca mi pomnożone wartości
(ob->setX(p)->oblicz())*(ob->setX(p)->oblicz()) a gdy napiszę

double p_value = (ob->setX(p)->oblicz());
		double k_value = (ob->setX(k)->oblicz());
		std::cout << p_value*k_value ;

to jest wszystko ok, nie wiem dlaczego i proszę o pomoc. :)

0

Czy aby na pewno k i p mają różną wartość. Poza tym, że wykonując dwie takie same funkcje w jednej linii nie ma zdefiniowanej kolejności,
to i tak nie powinno mieć wpływu na wynik (mnożenie jest przemienne).

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