Pytanie Czy a = 0; b = (a ++, a + 1); niezdefiniowane zachowanie (UB)?


zobacz prosty przykład:

int a = 0;
int b = (a ++  ,  a + 1); // result of b is UB or well defined ?  (c++03).

Zostało to zmienione w c ++ 11 / c ++ 14?


21
2018-01-24 07:58


pochodzenie


Wierzę, że to jest rzeczywiście zdefiniowane. Operator przecinka jest punktem sekwencji. - Mysticial
c ++ ma takie więcej UB, nie rozumiem dlaczego. - Khurshid
@Lundin: Cytując standard (C ++ 11): "Para wyrażeń oddzielonych przecinkiem jest oceniana od lewej do prawej;" - Michael Foukarakis
@Brandin Tak. Istnieje bardzo, bardzo niewiele przypadków, w których operator przecinka jest odpowiedni, oraz inicjalizacja for nie jest jednym z nich. (Wyrażenie "inkrementacja" w for może być jeden, ale warunek i inicjalizacja z pewnością nie są.) - James Kanze
@Brandin Operator przecinka nie jest tak powszechny, nawet w a for, a gdy się pojawi, każde podekspozycja modyfikuje a różne zmienna (np. ++ iter1, ++iter2). O ile stwierdzenie w tym przykładzie może być sztuczne, problem wyraźnie obejmuje dwa podwyrażenia operatora przecinka, które modyfikują tę samą zmienną. Który jest "fałszywym kodem", jakkolwiek na to patrzysz. - James Kanze


Odpowiedzi:


Wynik jest dobrze zdefiniowany i był od C ++ 98. Operator przecinka wprowadza punkt sekwencji (lub relację "zsekwencjonowana przed" w późniejszych C ++) między zapisem a drugim odczytem a i nie widzę żadnych innych potencjalnych przyczyn niezdefiniowanego zachowania.


28
2018-01-24 08:01



Zauważ, że dany kod jest również całkowicie zgodny z prawem w C i daje również zdefiniowane wyniki w C. - Jerry Coffin
@JerryCoffin: To prawda. Ograniczałem domenę mojego "od", aby odnieść się tylko do wersji C ++. - CB Bailey
Mocno uwierzyć, to kod, gdy większość ludzi nie wie na pewno, inni muszą dodać "wierzę ...", a tylko niektórzy wiedzą na pewno, że nie jest dobrze zdefiniowane - SChepurin
@SChepurin: Na szczęście istnieje obiektywna definicja dobrze zdefiniowanych programów C ++, standard, który przebija wszystkie wierzenia. :) - Michael Foukarakis
@mfukar - Niestety, dobrze zdefiniowane to bardzo często nie znaczy dobrze napisane kod. Jeśli ludzie natkną się na nieistotne linie programu, może to tylko oznaczać obfuskacja - SChepurin