All languages are mostly backward compatible, adding keywords, changing syntax, standarizing undefined behaviours or obvious flaws.
C and C++ are backwards compatible - there were no change of rules and operator precedence is reliable, compilers on the other hand were not always standards compliant, but this does not touch precedence.
There are different things to consider: saving
() is not really a save, but maintains readability without memorizing operator precedence (which is not a big deal, but it saves a second looking at code and saves more when there are more people involved). You can check that the compiler will produce binary identical output (if the parentheses are superfluous).
But there are situations where something is not regulated by the standard, e.g. gives undefined / compiler dependent results; on this you can never rely.
a[i] = ++i;,
i = ++i + i++,
Or architecture dependent like:
i << 33 for unsigned int (Intel vs ARM gives different results).
For Example Python 3 is not backward compatible with Python 2.
PHP 7 gives backward incompatibility with evaluation of indirect expressions (it was evaluated in mixed manner, now this is strictly left-to-right).
There are more languages that are less popular and broke backwards compatibility, even with operators precedence (if something was flawed, well why not?, and something made them "minor" not "major" languages, right?).
Another example is Fortran, it broke some syntax.