Инструкция:
x = x++;
эквивалентна:
tmp = x; // ... this is capturing the value of "x++"
x = x + 1; // ... this is the effect of the increment operation in "x++" which
// happens after the value is captured.
x = tmp; // ... this is the effect of assignment operation which is
// (unfortunately) clobbering the incremented value.
Короче говоря, инструкция не имеет никакого эффекта.
Ключевые моменты:
Обратите внимание, что в отличие от C и C ++ порядок оценки выражения в Java полностью определен, и нет места для изменения конкретной платформы. Компиляторам разрешено только изменять порядок операций, если это не изменит результат выполнения кода с точки зрения текущего потока. В этом случае компилятору будет разрешено оптимизировать весь оператор, потому что можно доказать, что он не работает.
Если это еще не очевидно:
Хотелось бы надеяться, что такие проверки кода, как FindBugs и PMD, будут отображаться как подозрительные.