Dlaczego a = i + i ++ nieokreślone i nieokreślone zachowanie
Przeczytałem kilka bardzo dobrych odpowiedzi na temat niezdefiniowanego zachowania i punktów sekwencji (np.Niezdefiniowane zachowanie i punkty sekwencji) i rozumiem to
int i = 1;
a = i + i++; //this is undefined behaviour
jest niezdefiniowanym kodem, zgodnie ze standardem C ++. Ale jakie jest głębsze uzasadnienie tego, że jest to niezdefiniowane zachowanie? Czy nie wystarczyłoby, aby uczynić to nieokreślonym zachowaniem? Normalnym argumentem jest to, że mając kilka punktów sekwencji, kompilatory C ++ mogą zoptymalizować lepiej dla różnych architektur, ale nie pozostawiając jej nieokreślonej, również dla tych optymalizacji? W
a = foo(bar(1), bar(2)); //this is unspecified behaviour
kompilator może również optymalizować i nie jest to niezdefiniowane zachowanie. W pierwszym przykładzie wydaje się jasne, że a jest albo 2 albo 3, więc semantyka wydaje się być dla mnie jasna. Mam nadzieję, że istnieje uzasadnienie, dlaczego niektóre rzeczy są nieokreślone, a inne nieokreślone.