funkcje/metody w return

funkcje/metody w return
KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2520
0

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

Kopiuj
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:

Kopiuj
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:

Kopiuj
return a() || b();
galleanv
  • Rejestracja: dni
  • Ostatnio: dni
0

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

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

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



int _tmain(int argc, _TCHAR* argv[])
{
	if(foo1() && foo2());
	getchar();
	return 0;
}
KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2520
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

galleanv
  • Rejestracja: dni
  • Ostatnio: dni
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.

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2520
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ć

  • Rejestracja: dni
  • Ostatnio: dni
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 :>

EE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 152
0

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

msm
  • Rejestracja: dni
  • Ostatnio: dni
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)

deus
  • Rejestracja: dni
  • Ostatnio: dni
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.

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
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ć.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.