Co to jest sequence point?

Co to jest sequence point?
RC
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:32
0

Witam
Być może ktoś wie, jeśli tak to wytłumaczyłby ktoś po polsku co to jest sequence point? Jest o tym dużo artykułów na internecie ale wszystkie są anglojęzyczne i typu "gadanie o Szopenie", żeby nie powiedzieć inaczej a nic się z tego zrozumieć nie da, jedynie możesz się domyślać co to jest de facto ten sequence point. Moim zdaniem jest to po prostu finalna wartość wyrażenia, nie żadna pośrednia, tylko już zewaluowana czyli dla poniższego kodu

Kopiuj
X = a[i++];

sequence point mamy w momencie gdy wartość X oraz i jest już zewaluowana.
Ponadto często dla sequence pointów może być undefined behavior np. dla poniższego wyrażenia

Kopiuj
X = a[i++] + b[i++];

co kompilator to może być inna finalna wartość wyrażenia X oraz i czyli inna wartość sequence pointu.

edytowany 2x, ostatnio: flowCRANE
flowCRANE
Tytułowanie wątków, Formatowanie treści – następny wątek z nic nie mówiącym tytułem poleci do kosza.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:4 minuty
  • Lokalizacja:Szczecin
0

Sequence point to coś, o czym od dobrej dekady możemy zapomnieć, bo od C++11 ich w C++ nie ma. W uproszczeniu sequence point to punkt w wykonaniu programu, w którym nie ma żadnych niezaaplikowanych efektów ubocznych (czyli np. postfix ++)


RC
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:32
0

nie rozumiem jaki może być efekt uboczny postfixa. Właśnie kolega miał pytanie na rozmowie kwalifikacyjnej o sequence pointy i stąd próbuję się dowiedzieć. Odpowiem w razie czego to co Ty mi napisałeś, ale podejrzewam, że rekruterzy mogą drążyć co to jest efekt uboczny. Jakby to im wytłumaczyć po polsku. Może w ten sposób, że wyobraźmy sobie że mamy kod assemblerowy po kompilacji to sequence point to jest ten punkt, linijka instrukcji segmentu kodu w którym wartość i oraz X jest znana. A teraz przejdźmy parę linijek wyżej i możemy być w takim punkcie programu w którym np. wartość X jest już zewaluowana, znana ale "i" jeszcze nie bo jesteśmy przed instrukcją assemblerową która robi postinkrementację. Czyli sequence pointy to są można powiedzieć takie relacje pomiędzy kodem assemblerowym a instrukcją w C++/C. Sequence pointy to są te linie w segmencie kodu przy których możemy powiedzieć że procesor jest przy średniku, że wykonał już całą instrukcję w C++ zakończoną średnikiem. Będzie to dobrze jak będą drążyć temat?

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:4 minuty
  • Lokalizacja:Szczecin
0
Kopiuj
int i = 0;
int j = i++;

W drugiej linii, wartością i++ jest 0, a efektem ubocznym zwiększenie wartości i.

Nie mieszałbym w to asemblera, bo kompilator ma naprawdę dużą dowolność w przestawianiu kodu wynikowego, o ile nie zmieni semantyki programu (the as-if rule).

Ale generalnie sequence point był w ; oraz w ) przy warunku ifa/while'a (nie jestem tego ostatniego pewien, ale zdziwiłbym się gdyby było inaczej).


Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 6 godzin
2

Być może ktoś wie, jeśli tak to wytłumaczyłby ktoś po polsku co to jest sequence point?

Stare pojęcie które nie jest używane w najnowszych wersjach standardu.

Jeśli chodzi o pre- i postinkrementację (oraz odpowiednie dekrementacje) to w C++ bardzo łatwo o UB jeśli użyjemy tej samej zmiennej dwa razy, np.

Kopiuj
i = i++;
a = ++i + i;

Po prostu C++ to język w którym jest mnóstwo tego typu pułapek. Takie wyrażenia są "undefined", bo tak mówi standard że są undefined, mimo że - teoretycznie - każde tego typu wyrażenie mogłoby mieć jasno zdefiniowany wynik (tak jest np. w C#).

co kompilator to może być inna finalna wartość wyrażenia X oraz i

UB to UB - może powodować wywalenie programu, złe działanie jakiejś pętli czy warunku - nie tylko "inny wynik".

wil
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 6 lat
1

wyrażenie:
a = ++i + i;
jest jednoznacznie zdefiniowane, bo operacje są wykonywane po kolei - od lewej do prawej.

Niejednoznaczne byłoby np. coś takiego: fun(++i++, i++, i++);

ponieważ kolejność obliczania argumentów może być tu dowolna.

proponuję przeanalizować takie coś:
i = (++i = 1) ? i++ : i--; :)

Zobacz pozostałe 7 komentarzy
wil
Przecież o to w tym szajsie chodzi: wielowątkowe obliczenia byłby łatwe do zaprojektowania gdyby nie problemu z kolejnością, zatem projektanci kompilatorów promują te śmieszne ograniczenia, bo to im ułatwia robotę. :)
Patryk27
Co mają do standardu C++ projektanci kompilatorów?
wil
A co ma rolnik do jakości żywności, albo piekarz do metod wypieku ciasta?
kq
Kolego, albo trollujesz, albo nie masz zielonego pojęcia, o czym mówisz. W obu przypadkach, do czytających: @wil nie opisuje C++, tylko jakiś wyimaginowany język.
wil
Obawiam się że te standardy nie opisują c++, lecz jakieś... idealizm teoretyczny.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 6 godzin
5
wil napisał(a):

proponuję przeanalizować takie coś:
i = (++i = 1) ? i++ : i--; :)

Uwaga, początek analizy.
UB.
Koniec analizy.

JH
UB chodzi o Urząd Bezpieczeństwa?
JH
Aaa ok znam - wysłałem tam mojego MacBooka do serwisu pół roku temu i jeszcze mi go nie odesłali. Nie polecam. Za marszałka Stalina się bardziej starali.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)