x? a:b czy if?

Skyler
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 10 lat
  • 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];
	}
Laflx
a co robi ten znak zapytania i co robi dwukropek ?
spartanPAGE
@Laflx jeśli (wyrażenie) to (wartość) lub w innym przypadku (wartość) co się tłumaczy na condition? valueIfTrue : valueIfFalse
Laflx
aha, dziękuję. :) w R znam tylko ifelse(warunek,jesli prawda, jesli fałsz)
spartanPAGE
  • Rejestracja:około 12 lat
  • Ostatnio:około 9 godzin
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;
    }
edytowany 3x, ostatnio: spartanPAGE
Skyler
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 10 lat
  • 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:około 12 lat
  • Ostatnio:około 9 godzin
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ć?

edytowany 1x, ostatnio: spartanPAGE
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:2412
0
Skyler
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 10 lat
  • 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:około 20 lat
  • Ostatnio:około 2 godziny
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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:20 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/


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Wibowit
bo tu chodzi o samo if kontra operator warunkowy, a nie czy cały kod jest już w bibliotece standardowej.
_13th_Dragon
A masz może jakiś pomysł czemu autorzy std:: nie rozdzielili twego wyboru podczas implementacji tegoż max_element ?
Wibowit
rozdzielili czy podzielili? nie jestem szkolony w czytaniu w myślach, ale prawdopodobnie zrobiono to by zredukować liczbę przypisań, co może być ważne przy dużych obiektach. poza tym, podejrzewam, że dla losowych danych ilość wejść w ifa jest rzędu O(log n). w przypadku danych całkowicie uporządkowanych ify będą bezbłędnie przewidziane przez układ przewidywania skoków. ogólnie tutaj pewnie operator warunkowy jest bardziej sztuką dla sztuki, ale przy porównywaniu intów zostałbym przy nim tak czy siak.

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.