Dlaczego poniższe wyrażenie powoduje niezdefiniowane zachowanie?Dlaczego to niezdefiniowane zachowanie?
int i = 5;
i = (i,i++,i) + 1
Moje pytanie jest pod wpływem Als' question here
Dlaczego poniższe wyrażenie powoduje niezdefiniowane zachowanie?Dlaczego to niezdefiniowane zachowanie?
int i = 5;
i = (i,i++,i) + 1
Moje pytanie jest pod wpływem Als' question here
Nie jest niezdefiniowana.
tu odpowiedzi na C Sequence points and partial order
myślę, że samo w C++ (i tu jest moja odpowiedź, zanim zobaczyłem, że link):
Operator przecinek wprowadza punkt sekwencji (i ograniczeń w pewnym stopniu kolejność wyrażenie należy ocenić - w lewo w prawo, zanim), a więc:
i
są oddzielone przez punkt sekwencji (drugi przecinek).i
w i++
jest oddzielona od wszystkiego innego przez punkty sekwencji.i
przez =
jest nie oddzielony od ostatniego wystąpienia i
w wypowiedzi, ale to jest OK, bo mamy możliwość dostępu i
i modyfikować go bez przerywania punktu sekwencji, pod warunkiem, że dostęp jest " aby określić wartość do zapamiętania "(5/4).Biorąc pod uwagę tylko fakt, że ',' jest punktem sekwencji, tak. Niestety standard jest bardzo ostrożny: 'Zwróć uwagę, że niektóre aspekty sekwencjonowania w abstrakcyjnej maszynie są nieokreślone; powyższe ograniczenie skutków ubocznych dotyczy tej konkretnej sekwencji wykonania, w której generowany jest prawdziwy kod. " –
Chciałem odpowiedzieć, ale nie zrobiłem tego. [Jeszcze jedno pytanie o niezdefiniowanym zachowaniu] ;-) –
@Let_Me_Be: Przyznaję, że nie rozumiem tego przypisu. Co to znaczy "wygenerować rzeczywisty kod" w sekwencji wykonawczej "? –
Bo to nie jest zdefiniowane w standardzie, który z post-przyrostu lub cesji odbędzie się pierwszy; pozostawia się je do implementacji kompilatora, aby zadecydować o ich kolejności.
jest niezdefiniowana w C++ do przypisania wartość zwiększona do siebie:
i = i++
Co powinienem zrobić po tym i
? Czy powinna to być poprzednia wartość, czy jedna plus poprzednia wartość? Kolejność wykonywania pozostawia się kompilatorowi, aby różne platformy miały różne wyniki.
Jestem prawie pewien, że 'i' powinien pozostać niezmieniony po tym. Jest to wciąż technicznie niezdefiniowane zachowanie z powodu punktu sekwencyjnego, ale nie ma mowy, aby wynik mógł być inny. –
Czy to pytanie dodaje coś do dyskusji? – KevinDTimm
Co to jest niezdefiniowane zachowanie. –
Po prostu z ciekawości: Co znaczy "(i, i ++, i)"? Czy to jest lista? – sleske