I just tested the following code:
int x = 90;
x = x - (x = x - 1);
x - 1
x - the new value of x
All binary operators except for the assignment operators are evaluated from left to right; assignment operators are evaluated right to left.
You are doing
90 - (90 - 1) =>
It's important to not confuse precedence with order of evaluation. They are related but not the same.
As @ruakh points out, the JLS spec put it differently to the tutorial above.
The left-hand operand of a binary operator appears to be fully evaluated before any part of the right-hand operand is evaluated.
If the operator is a compound-assignment operator (§15.26.2), then evaluation of the left-hand operand includes both remembering the variable that the left-hand operand denotes and fetching and saving that variable's value for use in the implied binary operation.
If evaluation of the left-hand operand of a binary operator completes abruptly, no part of the right-hand operand appears to have been evaluated.
Rather than say the assignment is evaluated right to left, it treats assignment as first a store of the variable to be updated, then an evaluation of the value and finally an assignment.