funkcje/metody w return

0

data jest typu vector< vector<dowolny typ="typ"> >
czy zapis:

return data.size() && data[0].size();

gwaranture mi, że data[0].size() nie wykona się w przypadku gdy data.size() bedzie rowne 0 (brak AV), czy powinienem to zapisać raczej jako:

return data.size()?data[0].size():false;

drugie rozwiązanie powinno być zawsze prawidłowe, ale pytam się z ciekawości, czy mogę stosować krótszą formę (w przypadku większej ilości metod ten zapis mi się znacznie uprości). Pytanie także w sumie dotyczyłoby if'ów oraz podobnych konstrukcji:

return a() || b();
0

Dosyć łatwo można sprawdzić to samemu...

 
bool foo1()
{
	printf("CP1");
	return false;
}

bool foo2()
{
	printf("CP2");
	return true;
}



int _tmain(int argc, _TCHAR* argv[])
{
	if(foo1() && foo2());
	getchar();
	return 0;
}
0

jak to się zachowa na gcc to ja wiem, chodzi mi o to czy jak skompiluje ten kod innym kompilatorem to zachowa się tak samo

0
krwq napisał(a)

jak to się zachowa na gcc to ja wiem, chodzi mi o to czy jak skompiluje ten kod innym kompilatorem to zachowa się tak samo

Jakieś standardy powinny obowiązywać, nie? xD

ps. na msvc foo2() nie zostanie wywołane.

0

teoretycznie tak, ale w praktyce nie jestem co do nich pewien :P na gcc też mi się nie wywołuje, ale wolałem się upewnić

0

hmm, a kompilator nie ma flagi pełnej ewaluacji Boolean ? Bo w Delphi jest takie coś. To może i kompilatory C++ też o to zadbały :>

0

Zawsze lepiej mieć pewność, że wykona się tak jak chcemy. Dlatego wybierz rozwiązanie drugie.

1

Zawsze lepiej mieć pewność, że wykona się tak jak chcemy.

Błagam was... Operatory logiczne || i && w C++ są zawsze leniwe - tzw. short circuit. (w przeciwieństwie do | i & - np. dlatego te drugie są stosowane do operacji bitowych a pierwsze nie).

When using the logical operators, C++ only evaluates what is necessary from left to right to come up with the combined relational result, ignoring the rest. Therefore, in this last example ((5==5)||(3>6)), C++ would evaluate first whether 5==5 is true, and if so, it would never check whether 3>6 is true or not. This is known as short-circuit evaluation, and works like this for these operators:

||operator|| short-circuit
||&& || if the left-hand side expression is false, the combined result is false (right-hand side expression not evaluated).
|| || || if the left-hand side expression is true, the combined result is true (right-hand side expression not evaluated).

Poważnie nikt z was nigdy z tego nie korzystał? (Ale plus dla krwq że zastanawia się co robi)

0

@msm, nie, nie zawsze są leniwe. Tylko ich nieprzeciążone wersje. Genialni twórcy C++ wpadli na pomysł przeciążenia operator|| i operator&&, które siłą rzeczy, jako zwykłe funkcje, muszą mieć argumenty wartościowane zachłannie.

0

Skrócone obliczanie warunków logicznych jest raczej standardem, i tak powinno być w każdym języku. Jak nie jest się pewnym, łatwo to przetestować.

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