x? a:b czy if?

Skyler
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
0

Cześć, które zastosowanie jest bardziej optymalne (jeżeli którekolwiek) i dlaczego? (na przykładzie znajdowania max wartości w tablicy)

Kopiuj
max=t[0]
for (int i = 1; i < size; i++)
	{
		max = (max < t[i]) ? t[i] : max;
	}
Kopiuj
max=t[0]
for (int i = 1; i < size; i++)
	{
		if(max<t[i]) max=t[i];
	}
spartanPAGE
  • Rejestracja: dni
  • Ostatnio: dni
2

Nie ma różnicy w wydajności; ?: służy upraszczaniu (bądź też komplikowaniu) kodu.

Kompilator zoptymalizuje oba do jednej formy.

Drugi przykład jest błędny, powinien wyglądać tak, żeby zgadzać się z pierwszym.

Kopiuj
max=t[0];
for (int i = 1; i < size; i++)
    {
        if(max<t[i]) max=t[i];
        else max = max;
    }
Skyler
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
0

Tylko że max=max nie jest tam potrzebne :). Czy mogę jakoś ominąć przypisywanie do max wartości max przy zastosowaniu x?a:b ?

spartanPAGE
  • Rejestracja: dni
  • Ostatnio: dni
0
Skyler napisał(a):

Tylko że max=max nie jest tam potrzebne :). Czy mogę jakoś ominąć przypisywanie do max wartości max przy zastosowaniu x?a:b ?

Nie. Składnia jest następująca cond? v1 : v2 i nie ma od niej odstępstw. Szczególnie przypisując, co innego chciałbyś zwrócić?

n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
Skyler
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
0
spartanPAGE napisał(a):
Skyler napisał(a):

Tylko że max=max nie jest tam potrzebne :). Czy mogę jakoś ominąć przypisywanie do max wartości max przy zastosowaniu x?a:b ?

Nie. Składnia jest następująca cond? v1 : v2 i nie ma od niej odstępstw. Szczególnie przypisując, co innego chciałbyś zwrócić?

Główny zamysł - jeżeli warunek jest spełniony, to przypisz a, jeżeli nie - nie rób nic.

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
3

Wszystko zależy od tego, co kompilator z tym zrobi. ZTCW to w żadnych standardach nie są opisane różnice na poziomie kodu maszynowego w tym przypadku. Możesz sobie zdezasemblować kod i zobaczyć co się utworzyło. To jednak nie da żadnej gwarancji, bo drobna zmiana w kodzie źródłowym może skutkować nie do końca lokalnymi zmianami w kodzie wynikowym. Musisz więc sprawdzać sobie w docelowym kodzie jak taka różnica wpływa na kod wynikowy.

Moje subiektywne odczucie jest takie, że operatora warunkowego powinno używać się tam, gdzie to nie zmniejszy czytelności. Czyli preferować na ifem, ale nie na siłę. W tym przypadku wybrałbym jednak trzecie rozwiązanie, czyli std::max.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1
Wibowit napisał(a):

W tym przypadku wybrałbym jednak trzecie rozwiązanie, czyli std::max.
A można wiedzieć czemu nie: http://www.cplusplus.com/reference/algorithm/max_element/

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.