x? a:b czy if?

0

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

max=t[0]
for (int i = 1; i < size; i++)
	{
		max = (max < t[i]) ? t[i] : max;
	}
max=t[0]
for (int i = 1; i < size; i++)
	{
		if(max<t[i]) max=t[i];
	}
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.

max=t[0];
for (int i = 1; i < size; i++)
    {
        if(max<t[i]) max=t[i];
        else max = max;
    }
0

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

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ć?

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.

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.

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/

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