[all] Zagnieżdżanie instrukcji

0

Witam!

Nie wiem gdzie to umieścić, więc robię to tutaj.
Czy jest różnica w efektywności działania programu, szybkości i w ogóle pomiędzy takim pisaniem funkcji:

void funkcja(...){
	if(warunek){
		if(drugi_warunek){
			if(kolejny_warunek){
				//i tu funkcja robi to co ma robic
			}else{
				//info o bledzie dla danego warunku
				return;
			}
		}else{
			//info o bledzie dla danego warunku
			return;
		}
	}else{
		//info o bledzie dla danego warunku
		return;
	}
	return;
}

a takim:

void funkcja(...){
	if(warunek){
		//info o bledzie dla danego warunku
		return;
	}

	if(drugi_warunek){
		//info o bledzie dla danego warunku
		return;
	}

	if(kolejny_warunek){
		//info o bledzie dla danego warunku
		return;
	}

	//i tu funkcja robi to co ma robic

	return;
}

Drugi sposób wydaje mi się lepszy. Ale czy tak jest?

0

Przeciez to co podales nie robi tego samego [glowa]

0
Wolverine napisał(a)

Przeciez to co podales nie robi tego samego [glowa]

Może i tak, ale jemu chodziło raczej o podanie przykładu (niekoniecznie podał dobry) dwóch różnych rozwiazań wykonujących (teoretycznie) tą samą pracę. Ja też byłbym ciekawy odpowiedzi - co jest efektywniejsze? Moim zdaniem jest to 2. sposób ale pewnie się mylę (chociaż dla wygody programisty zdecydowanie 2. - przynajmniej dla mnie).

0

napisz tak:

if(~warunek1 || ~warunek2 || ...)
{tu sie nie wykona}
else
{tu się wykona}

oczywiście warunki w kolejności ich "trafiania", czyli im częsciej warunek ejst fałszywy tym bliżej początku ifa powinien być, czyli

warunek1 częsciej fałszywy niż warunek2 itd...

oczywiscie tylko w przypadku gdy tak jak w c/c++ sprawdza się warunki do pierwszego momentu jednoznacznego określenia wartości logicznej całego wyrazenia, a nie wszytkie warunki jak leci

acha oczywiscie gdyby w tych dwóch kodach nie było

return;
po kazdym warunku, to pierwszy byłby szybszy

0

to nie jest na pewno problem nad ktorym moznaby sie bylo rozczulac pod katem 'szybkosci'
jednak ja zastosowalbym switcha, aby kod byl cztelniejszy

0

Może nie napisalem tego zbyt dokładnie.
Pomiędzy warunkami jest jeszcze np. jakiś kod. Wykonuje się i wtedy jest warunek. Jeśli nie byłoby kodu to jasne, że łączę warunki i po sprawie.
:: - efekt działania nie jest taki sam??? Według mnie jest. Jeśli się mylę, wyprostuj moje myśli :)
Chodzi mi głównie o to czy jest różnica w działaniu programu jeśli wchodzi się w kolejne warunki, warunki, warunki... i dopiero tam się kod wykonuje, czy należy raczej starać się aby nie zagłębiać się w warunki.
Jest w ogóle jakieś ograniczenie co do ilości zagnieżdżeń?

0
-=mAkAbrAs=- napisał(a)

:: - efekt działania nie jest taki sam??? Według mnie jest. Jeśli się mylę, wyprostuj moje myśli :)

A ja moge? ;)
Sprawdz, co sie stanie w obu przypadkach, gdy warunek == false i drugi_warunek == true.

0

DD
No tak, powinienem napisać w drugiej funkcji przed każdym warunkiem '!'
Się zgadza. Tyle, że mi głównie chodziło o to zagłębianie. I pisałem "warunek" w jednej i drugiej funkcji. Oczywiście, że warunki są "odwrotne"
Teraz lepiej? :):)

void funkcja1(int x){
	if(x>=1){
		//jakis kod
		if(x>=2){
			//jakis kod
			if(x>=3){
				//wlasciwy kod
				MessageBox(0,"większe lub równe 3","",MB_OK);
			}else{
				MessageBox(0,"mniejsze od 3","",MB_OK);
				return;
			}
		}else{
			MessageBox(0, "mniejsze od 2","",MB_OK);
			return;
		}
	}else{
		MessageBox(0,"mniejsze od 1","",MB_OK);
	}
	return;
}

void funkcja2(int x){
	if(!(x>=1)){
		MessageBox(0,"mniejsze od 1","",MB_OK);
		return;
	}
	//jakis kod
	if(!(x>=2)){
		MessageBox(0, "mniejsze od 2","",MB_OK);
		return;
	}
	//jakis kod
	if(!(x>=3)){
		MessageBox(0,"mniejsze od 3","",MB_OK);
		return;
	}
	//wlasciwy kod
	MessageBox(0,"większe lub równe 3","",MB_OK);
	return;
}
0

:D Oba wygenerują identyczny kod, choć pierwsze pewnie będzie się o ułamek tysięcznej sekundy dłużej kompilowało, ze względu na to zagnieżdżanie. Kompilator i tak w obu przypadkach zrobi z tego taka drabinke (w pseudoassemblerze, bez optymalizacji):

cmp x, 1
jl aaa
zrob_cos
aaa:
cmp x, 2
jl bbb
zrob_cos_2
bbb:
itp....

Po optymalizacji zapewne zauwazy np., ze jesli x >= 3, to i x >= 1 i jakos z tego skorzysta, zeby zmniejszyc liczbe skokow... O ile jest wyst. inteligentny.

0

Echh...
Właśnie takie pytania dręczyły mnie przez cały czas, kiedy pisałem w językach wysokopoziomowych. I właśnie za to kocham asemblera :]

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