Что делает стандарт C таким сложным для определения точки последовательности?

По моему мнению, с предварительным и почтовым приращением в C. A post-increment вступит в силу после утверждения.

Пример:

int num = 10;
int sum = num ++;  //sum & num at this point is 10
printf("%d %d", sum, num);  //we should get 10 11 

При этом pre-increment вступает в силу немедленно.

int num = 10;
int sum = ++ num ;  //num is evaluated to 11 first, then pass in to sum
printf("%d %d", sum, num);  //we should get 11 11

Следующие операторы приведут к неожиданным результатам из-за неопределенного поведения в C.

int x = 5;
printf("%d %d %d %d\n", ++x, ++x, ++x, x);

int y = 5;
printf("%d %d %d %d\n", y++, y++, y++, y);

Вывод программы на C:

8 7 6 5
7 6 5 5

Мой вопрос: Почему C не может просто определить точку последовательности слева направо? Все мои прошлые преподаватели в школе учили нас, что в программировании оно оценивается слева направо. Но почему в данном конкретном случае стандарту C так сложно определить порядок выполнения. Мне больше любопытно, почему они не могут интерпретировать это слева направо? По какой причине они не могут этого сделать?


PS: я посетил много постов с похожим названием. Но не решать эту проблему: Почему эти конструкции (с использованием ++) имеют неопределенное поведение?

Вывод этой программы. Confused?


person user3437460    schedule 23.11.2014    source источник
comment
Вопрос, который вы связали, объяснил это очень хорошо. Какую часть вы не понимаете?   -  person Yu Hao    schedule 23.11.2014
comment
Я могу понять, когда это обычное однострочное выражение. Однако я надеюсь, что кто-нибудь сможет объяснить, почему приращение оценивается с правой стороны?   -  person user3437460    schedule 23.11.2014
comment
внимательно прочитайте повторяющийся вопрос, который вы сами связали. Он не оценивается справа налево, порядок не указан.   -  person Yu Hao    schedule 23.11.2014
comment
Более того, почему Java не рассматривает is как неопределенное поведение, а C делает?   -  person user3437460    schedule 23.11.2014
comment
Потому что Java — это другой язык.   -  person a3f    schedule 23.11.2014
comment
Java гарантирует, что выражения оцениваются слева направо и что побочные эффекты таких операторов, как ++ и --, применяются сразу после вычисления. С нет; за некоторыми исключениями, C оставляет порядок оценки неуказанным и не гарантирует немедленного применения побочных эффектов.   -  person John Bode    schedule 23.11.2014
comment
@YuHao, пожалуйста, снова откройте вопрос, я его отредактировал.   -  person user3437460    schedule 23.11.2014
comment
@YuHao Может ли кто-нибудь помочь мне отменить этот отрицательный голос? :(   -  person user3437460    schedule 23.11.2014
comment
@ user3437460: не гарантируется, что предварительное увеличение вступит в силу немедленно; результатом ++x является x+1, но x не нужно изменять сразу после оценки. Я думаю, что это источник вашего замешательства.   -  person John Bode    schedule 23.11.2014
comment
@JohnBode Большое спасибо за ваш ответ. Вы можете оставить свой ответ ниже? Можете ли вы также помочь мне нейтрализовать этот отрицательный голос положительным? :)   -  person user3437460    schedule 23.11.2014
comment
Есть разница между тем, что вы не можете сделать, и тем, что вы не делаете. Как вы заметили, у Java другая семантика. Если вы хотите получить общее представление о том, почему поведение undefined в случаях, когда вы могли бы определить его?, то это обсуждается во многих местах... вы можете немного поискать о философия неопределенного поведения   -  person HostileFork says dont trust SE    schedule 23.11.2014
comment
@ user3437460: Причина, по которой C не указывает порядок оценки, заключается в том, чтобы позволить компиляторам оптимизировать эти оценки. Это было обдуманное дизайнерское решение. Когда Гослинг разрабатывал Java, он решил обменять оптимизацию на предсказуемость.   -  person John Bode    schedule 23.11.2014
comment
@JohnBode Если бы вы только могли разместить свой ответ ниже, я обязательно подниму ваш ответ или даже приму его. Вы - те немногие, кто готов объяснить, а не просто сделать мой пост дубликатом, что совсем неконструктивно.   -  person user3437460    schedule 23.11.2014
comment
@ user3437460: вопрос помечен как повторяющийся; ответы не принимаются.   -  person John Bode    schedule 24.11.2014