x? a:b czy if?

Odpowiedz Nowy wątek
2015-01-03 19:11
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];
    }
a co robi ten znak zapytania i co robi dwukropek ? - Laflx 2015-01-03 19:19
@Laflx jeśli (wyrażenie) to (wartość) lub w innym przypadku (wartość) co się tłumaczy na condition? valueIfTrue : valueIfFalse - spartanPAGE 2015-01-03 19:22
aha, dziękuję. :) w R znam tylko ifelse(warunek,jesli prawda, jesli fałsz) - Laflx 2015-01-03 19:33

Pozostało 580 znaków

2015-01-03 19:15
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;
    }
edytowany 3x, ostatnio: spartanPAGE, 2015-01-03 19:17

Pozostało 580 znaków

2015-01-03 20:53
0

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

Pozostało 580 znaków

2015-01-03 21:02
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, 2015-01-03 21:03

Pozostało 580 znaków

2015-01-03 21:08
0

To jest bardziej optymalne.

Pozostało 580 znaków

2015-01-03 21:33
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.

Pozostało 580 znaków

2015-01-03 21:49

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.

Pozostało 580 znaków

2015-01-03 22:00
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.
bo tu chodzi o samo if kontra operator warunkowy, a nie czy cały kod jest już w bibliotece standardowej. - Wibowit 2015-01-03 22:10
A masz może jakiś pomysł czemu autorzy std:: nie rozdzielili twego wyboru podczas implementacji tegoż max_element ? - _13th_Dragon 2015-01-03 22:18
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. - Wibowit 2015-01-03 22:26

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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