Но то, что разные компиляторы по-разному определяют последовательность вычислений, тем более разные версии одного компилятора - это полный ппц, на мой взгляд. За 40 лет так с этим и не определились? А если в ядре линукса много ++ и --, то при компиляции в новом GCC разработчикам придётся лопатить миллионы строк кода, чтобы всё менять?
Всякие best practices и правила хорошего тона в программировании не просто так придумали. Машина создана для человека, а не человек для машины, поэтому код должен быть в первую очередь как можно более понятным и легкочитаемым, потом ещё переносимым и совместимым. Можно надеяться, что ядро писали не студенты, и он к этим стандартам не чувствителен.
Достаточно того, что собрать почти любой чужой проект на сях, не имея конкретно той среды/компиляторов/либ той версии с теми же настройками/опциями/ключами, какие были у автором в момент билда, обычно дерьмовенькое занятие с кучей геморроя.
Я и сам не пользуюсь ++ и -- в арифметических выражениях, но иногда с ними код короче и интересней смотрится. Вот, например, возведение a в степень n:
int result;
while (n--)
result *= a;
return result;
Во-во, а теперь представь, что ты видишь этот код впервые, потому что лопатишь чей-то чужой говнопроект. И тут надо сидеть вкуривать, как оно работает и почему. Или почему не работает. Или почему то работает, то нет, что чаще всего бывает. Например, этот код чувствителен к положению --. Надо ещё помнить, что выражение в скобках действительно, пока n не равно (не "больше", а "не равно"). Если бы это был код вычисления факториала, т.е. умножение шло на n, там бы ещё могло на 0 умножиться. Уже три возможности запутаться в трёх строчках.
Вот этот код намного проще и понятней. Достаточно запомнить один раз на всю жизнь, что для прогона цикла for в N раз от 0 надо ставить знак < N. От единицы <=. Чаще пишут от 0, потому что индексация массивов начинается с 0.
for (int i = 0; i < n; i++ ) result *= a;