Co to jest sequence point?

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

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

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

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

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 ++)

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?

0
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).

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.

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".

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--; :)

5
wil napisał(a):

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

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

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.