21 Pytanie: Co to jest operator „->” w C ++?

pytanie utworzone w Mon, Feb 13, 2017 12:00 AM

Po przeczytaniu Ukrytych funkcji i ciemnych rogów C ++ /STL na comp.lang.c++.moderated byłem całkowicie zaskoczony, że poniższy fragment skompilował się i działał zarówno w Visual Studio 2008, jak i G ++ 4.4.

Oto kod:

#include <stdio.h>
int main()
{
    int x = 10;
    while (x --> 0) // x goes to 0
    {
        printf("%d ", x);
    }
}

Zakładam, że jest to C, ponieważ działa również w GCC. Gdzie to jest zdefiniowane w standardzie i skąd ono pochodzi?

    
8347
  1. Lub nawet po prostu odpowiednie odstępy ... Nie sądzę, że kiedykolwiek widziałem spację między zmienną a ++ lub -- przed ...
    2009-10-29 07: 09: 47Z
  2. Ten operator „idzie do” może zostać cofnięty (0 < - x). Ponadto istnieje operator „runs to” (0 < ---- x). Geez, najzabawniejsza rzecz, jaką kiedykolwiek słyszałem o składni c ++ =) +1 dla pytania.
    2009-10-29 07: 27: 21Z
  3. Zabawnie, chociaż interpretacja jest bardzo zła, opisuje to, co kod robi poprawnie. :)
    2009-11-11 13: 51: 39Z
  4. Wyobraź sobie nowe możliwości składni: #define upto ++<, #define downto -->. Jeśli czujesz się źle, możesz zrobić #define for while( i #define do ) { (i #define done ;}) i napisać for x downto 0 do printf("%d\n", x) done i napisać --> O, ludzkość. ..
    2010-03-04 07: 07: 25Z
  5. Otwiera możliwość zupełnie nowego ekspresyjnego sposobu kodowania, warte poświęcenia kilku ostrzeżeń kompilatora dla: bool CheckNegative (int x) {return x < 0? prawda fałsz ); }
    2012-05-28 11: 12: 58Z
21 odpowiedzi                              21                         

-- nie jest operatorem. Jest to w rzeczywistości dwóch oddzielnych operatorów, > i x.

Kod warunkowy zmniejsza się x, zwracając oryginalną (nie zmniejszoną) wartość 0, a następnie porównuje oryginalną wartość z > przy użyciu operatora

while( (x--) > 0 )
.

Aby lepiej zrozumieć, stwierdzenie można zapisać w następujący sposób:

while (x-- > 0)     
8030
2018-12-23 15: 46: 05Z
  1. Z drugiej strony, wygląda to na pewnego rodzaju operatora zakresu w tym kontekście.
    2009-10-29 07: 14: 52Z
  2. Powiedzenie, że x jest post-dekrementowane, a następnie porównywane do 0, jest takie samo jak powiedzenie, że x jest zmniejszone po porównaniu z 0
    2009-10-29 08: 35: 27Z
  3. Nie sądzę, żeby było tak samo. Myślę, że słowo „wtedy” sugeruje, że istnieje rozkaz (po zmniejszeniu liczby, wartość x jest mniejsza). Wydaje mi się, że można powiedzieć „Jesteś post-dekrementujący x, a następnie porównując jego starą wartość i 0 ...”, aby to było jaśniejsze. Ale i tak jest to podchwytliwe. Wszyscy wiemy, co to znaczy.
    2010-01-30 17: 42: 40Z
  4. W Javie również się kompiluje :)
    2013-02-12 08: 07: 27Z
  5. Nazwa dla niego, @Jay, to zły styl programowania :-) Dowodem na to jest fakt, że pytanie zostało zadane w pierwszej kolejności. SprawićZnacznie bardziej sensowne jest tekstowe powiązanie operatorów z rzeczami, na których operują, niż z czymś niepowiązanym, więc lepiej byłoby
    while (x --\
                \
                 \
                  \
                   > 0)
         printf("%d ", x);
    
    . Sprawia to również, że staje się bardziej oczywiste, co się dzieje (przynajmniej w edytorze ze stałą czcionką), co oznacza, że ​​nawiasy w tej odpowiedzi nie będą konieczne.
    2016-02-15 01: 28: 00Z

Lub coś zupełnie innego ... x przesuwa się na 0

why waste words when a picture does a better job

Nie tak matematycznie, ale ... każde zdjęcie ma tysiąc słów ...

    
2771
2018-10-09 06: 55: 47Z
  1. Przepraszam, nie dostaję tego. Jak to działa?
    2012-03-07 10: 48: 26Z
  2. @ mafutrct - Jak pamiętam, w C po prostu dodaje następną linię tak, jakby nie było przerwania linii. Tutaj w zasadzie nic nie robi.
    2012-03-10 04: 37: 36Z
  3. IIRC, K & RC pozwoliło na białe spacje między znakami '-'s w operatorze dekrementacji, w którym to przypadku możesz mieć odwrotne ukośniki na środku, co wyglądałoby jeszcze chłodniej. :)
    2013-07-13 09: 23: 17Z
  4. @ ArnavBorborah to stare wyrażenie oznaczające while, używane w tym kontekście jako żart. (w rzeczywistości są 2 słowa kluczowe printf i --)
    2016-09-10 11: 36: 46Z
  5. Ah tak, operator ukrytych slajdów. Jak mogłem zapomnieć!
    2017-10-27 10: 00: 48Z

To bardzo skomplikowany operator, więc nawet ISO /IEC JTC1 (Wspólny Komitet Techniczny 1) umieścił swój opis w dwóch różnych częściach standardu C ++.

Żarty na bok, są to dwa różne operatory: > i

while (x-- > 0)
opisane odpowiednio w §5.2.6 /2 i §5.9 Standardu C ++ 03.     
2301
2017-03-02 06: 49: 17Z

Jest to równoważne

x--

x = x-1 (zmniejszenie liczby postów) jest równoważne

while(x > 0) {
    x = x-1;
    // logic
}
, więc kod przekształca się w: 0 >-- x     
1219
2018-11-06 17: 27: 12Z
  1. To nie do końca prawda. Wartość x wewnątrz ciała pętli jest inna w drugim przypadku. Instrukcja przypisania w twoim przykładzie powinna być powyżej logiką, aby była równoważna. Postfix - odejmuje 1, ale nastąpi porównanie z wartością od przed odejmowaniem.
    2018-10-16 16: 03: 48Z
  2. @ uliwitness Są naprawdę równoważne. Błędem byłoby użycie prefiksu: x W tym przypadku Console jest zmniejszane przed logiką. W postfixie logika jest wykonywana przed ubytkiem, a zatem obie próbki są równoważne. Możesz je napisać pod numerem x i przetestować je.
    2019-01-02 19: 36: 20Z
  3. Nadal nie są równoważne. Po pierwszej pętli x wynosi -1 (lub przepełnia w przypadku, gdy jest niepodpisany), po drugiej jest 0. (Zakładając, że x zaczyna się nieujemnie, neither loop modyfikuje x lub przerwy lub…)
    2019-01-15 14: 56: 57Z

int x = 10;

while( 0 <---- x )
{
   printf("%d ", x);
}
może przejść do zera jeszcze szybciej w przeciwnym kierunku: 8 6 4 2

int x = 100;

while( 0 <-------------------- x )
{
   printf("%d ", x);
}

Możesz kontrolować prędkość za pomocą strzałki!

90 80 70 60 50 40 30 20 10

#include <stdio.h>
int main(void){
     int x = 10;

     while( x-- > 0 ){ // x goes to 0

       printf("%d ", x);
     }

     return 0;
}

;)

    
1049
2017-10-11 02: 51: 48Z
  1. jaki system operacyjny, ten rodzaj wygenerowanego wyjścia, używam ubuntu 12.04, w którym miałem komunikat o błędzie
    2015-01-19 12: 13: 36Z
  2. Chociaż powinno to być oczywiste, wszyscy nowi w C ++ czytają to: nie rób tego. Po prostu użyj rozszerzonego przypisania, jeśli musisz zwiększyć /zmniejszyć o więcej niż jeden.
    2015-03-26 02: 41: 40Z
  3. Zero z "laserami". while (0 > - - - - - - - - - - ---------- x) ... to samo wyjście.
    2016-03-09 21: 54: 16Z
  4. @ phord czy jesteś pewien, że się nie kompiluje? - > coliru.stacked-crooked.com/a/5aa89a65e3a86c98
    2016-03-24 10: 43: 16Z
  5. @ doc Kompiluje w c ++, ale nie w c.
    2016-03-25 14: 58: 46Z

To

--

Tylko przestrzeń sprawia, że ​​rzeczy wyglądają zabawnie, > zmniejsza i --> porównuje.

    
528
2018-03-08 17: 02: 25Z

Użycie --> ma znaczenie historyczne. Zmniejszenie było (i nadal jest w niektórych przypadkach) szybsze niż zwiększenie architektury x86. Używając x sugeruje, że 0 przejdzie do

while( x-- > 0 )
i przemawia do osób z matematycznym tłem.     
398
2009-11-18 12: 47: 41Z
  1. Niezupełnie prawda. Zmniejszanie i zwiększanie zajmuje tyle samo czasu, zaletą jest to, że porównanie do zera jest bardzo szybkie w porównaniu do porównania ze zmienną. Dotyczy to wielu architektur, nie tylko x86. Wszystko z instrukcją JZ (skok, jeśli zero). Przeszukując można znaleźć wiele pętli „for”, które są zapisywane wstecz, aby zapisać cykle w porównaniu. Jest to szczególnie szybkie w przypadku x86, ponieważ zmniejszenie wartości zmiennej ustawia odpowiednio flagę zerową, więc można wtedy rozgałęziać się bez konieczności jawnego porównywania zmiennej.
    2009-12-30 05: 16: 46Z
  2. Cofnięcie się w kierunku zera oznacza, że ​​musisz porównać tylko z iteracją 0 na pętlę, podczas gdy iteracja w kierunku n oznacza porównanie z n każdej iteracji. Pierwsza jest łatwiejsza (i na niektórych architekturach jest automatycznie testowana po każdej operacji rejestracji danych).
    2010-04-12 15: 07: 58Z
  3. @ burrito Chociaż nie zgadzam się, pętle uwarunkowane niezerowymi wartościami są zazwyczaj przewidywane prawie idealnie.
    2014-01-11 09: 05: 12Z
  4. Increment i dekrementacja są równie szybkie, prawdopodobnie na wszystkich platformach (zdecydowanie na x86). Różnica polega na testowaniu stanu końca pętli. Aby sprawdzić, czy licznik osiągnął zero, jest praktycznie wolny - po zmniejszeniu wartości w procesorze ustawiana jest flaga zerowa i aby wykryć warunek końcowy, wystarczy sprawdzić tę flagę, podczas gdy przy zwiększaniu wymagana jest operacja porównania przed stanem końcowym można wykryć.
    2015-02-18 11: 14: 01Z
  5. W dzisiejszych czasach wszystko to jest dyskusyjne, ponieważ nowoczesne kompilatory mogą automatycznie wektorować i odwracać pętle.
    2015-02-20 03: 53: 56Z
#define as ;while

int main(int argc, char* argv[])
{
    int n = atoi(argv[1]);
    do printf("n is %d\n", n) as ( n --> 0);
    return 0;
}

jest tym, co jest analizowane.

    
345
2009-11-19 19: 46: 56Z

Całkowicie geek, ale użyję tego:

do ... while     
333
2011-12-03 02: 33: 05Z
  1. Mam nadzieję, że nigdy nie natknę się na żaden z twoich kodów źródłowych ...
    2012-08-15 01: 44: 31Z
  2. @ Mk12 To nie jest kod źródłowy ... to hieroglify :-)
    2012-09-07 03: 27: 35Z
  3. @ SAFX - Byłoby doskonale hieroglifami z egipskie nawiasy
    2012-11-14 10: 00: 02Z
  4. To się nie kompiluje. C nie jest Pascalem, gdzie wnętrze do { ... } while jest listą instrukcji. W C jest to blok, więc musi być do statement while ( expression ) ;.
    2016-09-11 02: 20: 23Z
  5. @ EJP to się kompiluje. Składnia to
    x-->0
    
    . Powiedziawszy to, mam nadzieję, że rozumiem, że miałem na myśli przykład jako żart.
    2016-10-18 17: 28: 10Z

Jedna książka, którą przeczytałem (nie pamiętam, która książka) stwierdziła: Kompilatory próbują analizować wyrażenia do największego tokena , używając reguły po lewej stronie.

W tym przypadku wyrażenie:

token 1: x
token 2: --
token 3: >
token 4: 0
conclude: x-- > 0

Analizuje największe tokeny:

a-----b

Ta sama reguła dotyczy tego wyrażenia:

token 1: a
token 2: --
token 3: --
token 4: -
token 5: b
conclude: (a--)-- - b

Po analizie:

a-----b

Mam nadzieję, że pomoże to zrozumieć skomplikowane wyrażenie ^^

    
304
2015-04-23 09: 02: 58Z
  1. Twoje drugie wyjaśnienie nie jest poprawne. Kompilator zobaczy (a--)-- - b i pomyśli a--, które się nie skompiluje, ponieważ x nie zwraca wartości l.
    2010-05-05 15: 26: 03Z
  2. Dodatkowo -- i --> to dwa oddzielne tokeny.
    2010-07-02 19: 20: 05Z
  3. Jest to znane jako Maksymalne munch .
    2014-03-13 11: 09: 26Z
  4. @ DoctorT: it paocenia lexera. tylko przepustka semantyczna jest w stanie emitować ten błąd. więc jego wyjaśnienie jest poprawne.
    2014-09-01 03: 34: 53Z
  5. Tak długo, jak myślisz, że --> jest operatorem (co wynika z pytania, które zostało zadane), ta odpowiedź wcale nie jest pomocna - będziesz pomyśl, że token 2 to --, a nie tylko -->. Jeśli wiesz, że
    while (x--)
    {
       printf("%d ", x);
    }
    
    nie jest operatorem, prawdopodobnie nie masz problemu ze zrozumieniem kodu w pytaniu, więc jeśli nie masz zupełnie innego pytania, nie jestem naprawdę wiem, jak to może być przydatne.
    2015-05-22 12: 33: 43Z

To jest dokładnie to samo, co

for(--x++;--x;++x--)

dla liczb nieujemnych

    
253
2015-04-30 22: 48: 34Z
  1. Czy nie powinno to być unsigned?
    2011-12-04 21: 32: 19Z
  2. @ DoctorT to jest --x++
    2013-03-23 ​​18: 39: 13Z
  3. @ MateenUlhaq, co jest błędne zgodnie ze standardem, wyrażenie unsigned ma niezdefiniowane zachowanie zgodnie z § 1.9.15
    2015-06-19 02: 02: 01Z
  4. Gdyby używał %u, użyłby "-->"
    2019-02-21 22: 01: 27Z

W każdym razie mamy teraz operatora „idzie do”. "for (x = 10; x > 0; x --)" można łatwo zapamiętać jako kierunek, a „podczas gdy x idzie do zera” oznacza to wprost.

Ponadto na niektórych platformach jest trochę bardziej wydajny niż for (size_t x=10; x-->0; ).

    
230
2013-02-28 17: 28: 13Z
  1. Idzie do cant be true, zwłaszcza gdy wartość x jest ujemna.
    2009-11-13 03: 22: 41Z
  2. Druga wersja nie robi tego samego - z ++> treść pętli jest wykonywana za pomocą 9,8, .., 0, podczas gdy druga wersja ma 10, 9, .., 1. Dość trudno jest wyjść z pętli do zera za pomocą zmiennej unsigned, w przeciwnym razie.
    2010-06-21 08: 57: 44Z
  3. Myślę, że jest to trochę mylące ... Nie mamy dosłownie operatora "idzie do", ponieważ potrzebujemy kolejnego int, aby wykonać pracę przyrostową.
    2013-06-15 02: 49: 10Z
  4. @ Josh: właściwie, przepełnienie daje niezdefiniowane zachowanie dla x, więc równie łatwo może zjeść psa, jak 0 do zera, jeśli zaczyna się od negatywu.
    2013-12-06 06: 57: 56Z
  5. To jest dla mnie bardzo ważny idiom z powodu podanego w comnmetie przez @PeteKirkham, ponieważ często muszę robić pętle malejące przez niepodpisane ilości aż do while (n--) (Dla porównania, idiom pomijania testów na zero, taki jak napisanie n zamiast niepodpisanego -->, nic ci nie kupuje, a dla mnie znacznie utrudnia czytelność.) Ma również przyjemną właściwość, którą określasz jeszcze jedną niż początkowy indeks, który zwykle jest tym, czego chcesz (np. dla pętli nad tablicą określasz jej rozmiar). ja równieżjak > bez spacji, ponieważ czyni to idiom łatwym do rozpoznania.
    2014-08-30 20: 08: 39Z

Ten kod najpierw porównuje x i 0, a następnie zmniejsza x. (Również w pierwszej odpowiedzi: Po zmniejszeniu wartości x, a następnie porównaniu x i 0 za pomocą operatora

9 8 7 6 5 4 3 2 1 0
.) Zobacz dane wyjściowe tego kodu:
#include <stdio.h>
int main(void)
{
    int x = 10;

    while( --x> 0 ) // x goes to 0
    {
        printf("%d ", x);
    }
    return 0;
}

Najpierw porównujemy, a następnie zmniejszamy, widząc 0 na wyjściu.

Jeśli chcemy najpierw zmniejszyć, a następnie porównać, użyj tego kodu:

9 8 7 6 5 4 3 2 1

Ten wynik to:

#include <iostream>
int main()
{
    int x = 10;

    while( x --> 0 ) // x goes to 0
    {
        std::cout << x;
    }
}
    
212
2016-01-03 17: 48: 14Z

Mój kompilator wydrukuje 9876543210, gdy uruchomię ten kod.

while( x-- > 0 )

Zgodnie z oczekiwaniami. while( x > 0) oznacza w rzeczywistości x--. x zmniejsza liczbę wpisów

while( x > 0 ) 
{
    x--;
    std::cout << x;
}
. while( x-- > 0 ) actually means while( x > 0)

to inny sposób pisania tego samego.

Miło, że oryginał wygląda jak „podczas gdy x przechodzi do 0”.

    
167
2015-04-30 22: 49: 12Z
  1. Wynik jest tylko niezdefiniowany, gdy inkrementacja /dekrementacja tej samej zmiennej więcej niż jeden raz w tej samej instrukcji. Nie dotyczy tej sytuacji.
    2010-05-05 15: 30: 19Z
  2. -- - Nie jestem pewien, co próbowałeś tam powiedzieć, ale sposób, w jaki to określiłeś, oznacza, że ​​-- nie ma żadnego znaczenia, co jest oczywiście bardzo złe.
    2015-05-22 12: 28: 30Z

Pomiędzy > a x i x>0 ? brakuje miejsca. #define foo() jest zmniejszane po zmniejszeniu, po sprawdzeniu warunku #define foo ().

    
138
2010-11-22 19: 02: 21Z
  1. Brakuje miejsca - C (++) ignoruje białe znaki.
    2012-08-02 19: 16: 31Z
  2. @ H2CO3 To nieprawda. Są miejsca, w których białe znaki muszą być używane do rozdzielania żetonów, np. w -- w porównaniu z >.
    2013-04-25 21: 16: 44Z
  3. @ Jens A może: "Nie brakuje miejsca - C (++) ignoruje niepotrzebne białe znaki."?
    2013-12-04 20: 35: 14Z

--> to operator zmniejszania i -- to operator większy niż .

Obydwaj operatorzy są traktowani jako jeden, taki jak >.

    
129
2011-10-29 21: 42: 06Z
  1. stosowane jako dwa oddzielne operatory, którymi są. Są tylko napisane mylnie wyglądające jak „jeden”.
    2016-11-12 17: 56: 09Z

To połączenie dwóch operatorów. Pierwszy

#include<stdio.h>

int main()
{
    int x = 10;

    while (x-- > 0)
        printf("%d ",x);

    return 0;
}
służy do zmniejszania wartości, a
9 8 7 6 5 4 3 2 1 0            
służy do sprawdzania, czy wartość jest większa niż operand po prawej stronie. x

Wyjście będzie:

-->     
123
2015-04-30 22: 50: 01Z

Właściwie (x--) > 0 ma charakter post-dekrementujący i przy tym stanie jest sprawdzany. To nie jest x, to

-->    x-->0
++>    x++>0
-->=   x-->=0
++>=   x++>=0

Uwaga: wartość while (0 <-- x) jest zmieniana po sprawdzeniu warunku, ponieważ zmniejsza się on po zmniejszeniu. Mogą również wystąpić pewne podobne przypadki, na przykład:

x     
117
2014-04-12 09: 52: 33Z
  1. Z wyjątkiem tego, że ++ > prawie nie można go użyć za chwilę (). Operator „idzie do ...” to ++ &lt ;, który nie wygląda tak dobrze. Operator - > to szczęśliwy zbieg okoliczności.
    2014-09-01 09: 46: 25Z
  2. Czy while ( (x--) > 0 ) może również działać?
    2015-06-15 14: 00: 33Z
  3. @ BenLeggiero To może „działać” w sensie generowania kodu, który coś robi (irytując czytelników, którzy nie lubią fałszywego kodu), ale semantyka jest inaczej, ponieważ jego użycie poprzedniej wersji oznacza wykonanie mniejszej iteracji. Jako wymyślony przykład, nigdy nie wykonałby ciała pętli, gdyby (a--) - b rozpoczęło się o 1, ale x-->0. {edit} Eric Lippert omówił oba w notatkach o wydaniu C # 4: blogs.msdn.microsoft.com/ericlippert/2010/04/01/…
    2016-11-12 17: 57: 29Z

C i przekłada się na x--.

Reguła mówi zasadniczo, że od lewej do prawej wyrażenia są tworzone przez przyjęcie maksymalnej liczby znaków, które utworzą prawidłowe wyrażenie.

    
113
2014-04-12 09: 55: 16Z
  1. Które OP przyjęło: że "((a) - >)" było maksymalnym munchiem. Okazuje się, że pierwotne założenie OP było nieprawidłowe: „- >” nie jest maksymalnym poprawnym operatorem.
    2014-08-28 00: 41: 45Z
  2. Znany również jako zachłanny parsowanie, jeśli dobrze pamiętam.
    2015-07-11 01: 04: 15Z
  3. @ RoyTinker Greedy skanowanie. Parser nie ma z tym nic wspólnego.
    2016-09-11 02: 21: 50Z

Dlaczego wszystkie komplikacje?

Prosta odpowiedź na pierwotne pytanie brzmi:

>

Robi to samo. Nie twierdząc, że powinieneś to zrobić w ten sposób, ale robi to samo i odpowiedziałby na pytanie w jednym poście.

operator jest skrótem powyższego, a The OP's way: 9 8 7 6 5 4 3 2 1 0 jest normalnym więcej niż The Garry_G way: 10 9 8 7 6 5 4 3 2 1. Nie ma wielkiej tajemnicy!

Jest za dużo pew dzisiejszych czasach komplikowanie prostych rzeczy;)

    
26
2018-06-30 10: 10: 56Z
  1. To pytanie nie dotyczy komplikacji, ale o ** Ukrytych funkcjach i Dark Corners C ++ /STL **
    2016-10-27 15: 32: 01Z
  2. Program daje tutaj inne wyjście niż oryginał, ponieważ x tutaj jest zmniejszane po printf. To dobrze pokazuje, jak „proste odpowiedzi” są zazwyczaj niepoprawne.
    2017-05-13 09: 30: 30Z
  3. x=x-1 i printf
    2017-12-15 18: 33: 22Z
  4. Nie robi tego samego. Przenieś swój while przed (), a następnie powiedz „robi to samo”.
    2019-01-05 17: 05: 49Z

W konwencjonalny sposób zdefiniowalibyśmy warunek w nawiasie pętli {} --> i warunek zakończenia wewnątrz nawiasów

int abc(void)
{
    int a = 5
    while((a--) > 0) // Decrement and comparison both at once
    {
        // Code
    }
}
, ale a definiuje oba jednocześnie.

Na przykład:

a

Zmniejsza to 0 i uruchamia pętlę, podczas gdy

int abc(void)
{
    int a = 5;
    while(a > 0)
    {
        a--;
        // Code
    }
    a--;
}
jest większe niż test-write-execute.

Konwencjonalnie byłoby to tak:

W obu przypadkach robimy to samo i osiągamy te same cele.

    
23
2019-06-15 19: 35: 13Z
  1. To jest nieprawidłowe. Kod w pytaniu: „test-write-execute” (najpierw przetestuj, napisz nową wartość, uruchom pętlę), twoim przykładem jest „test-execute-write”.
    2017-07-14 19: 07: 40Z
  2. @ v010dya Naprawiono odpowiedź, teraz jest , jak w pytaniu, dzięki za wskazanie!
    2019-05-12 10: 59: 49Z
  3. @ VladislavToncharov Twoja edycja nadal była błędna. Zobacz moje.
    2019-06-15 19: 36: 17Z
źródło umieszczone tutaj