I have a code snippet in Java:

 int y = ++x * 5 / x-- + --x;

So my confusion was since x--(postfix) has higher precedence than ++x(prefix) operator so x-- should be executed first then ++x.But a book states otherwise.Am I right in my thinking?

  • 5
    precedence != order of execution, see: blogs.msdn.microsoft.com/ericlippert/2008/05/23/…
    – Caleth
    Oct 11 '16 at 12:17
  • @Caleth This comment is important, and the only currently existing answer is wrong. You should turn your comment into a full answer. Dec 7 '18 at 8:46
  • 2
    doctor doctor it hurts when i do this...
    – jk.
    Dec 7 '18 at 8:49
  • Just curious. In C (and C++) this would be undefined behaviour. Does Java actually define the behaviour? Dec 7 '18 at 9:00
  • @NickKeighley yes, Java has a hatred of UB. It's left to right
    – Caleth
    Dec 7 '18 at 9:36

In the absence of any structures being indexed using these variables, which is where prefix and postfix operators really come into their own, I'd suggest that this is a largely academic exercise.

Speaking pragmatically; take control of the expression and add brackets to make the order explicit, if only to save your sanity. It also eliminates any possibility of confusion and/or portability issues (new compiler, [slightly] different operator precedence, nasty bug).

  • W.,I agree but if this code is analysed,then am I right in my approach Oct 11 '16 at 11:43
  • You are wasting your time analyzing this code.
    – user949300
    Dec 7 '18 at 6:46
  • Brackets don't change order of execution. Splitting the expression into separate statements does (and is a good idea). Dec 7 '18 at 8:42

Precedence determines which calculations will happen. Evaluation is done left to right among things that could occur "at the same time" in Java.

It is equivalent to the following

int t1 = ++x;
int t2 = x--;
int t3 = --x;
int y = t1 * 5 / t2 + t3;

If you have to care about either of those things, you've got bad code. Change it so that the reader doesn't have to consult their rulebook to know what is happening.

  • If there are "too many" ++s and --s in a line, the rules don't always apply (at least in C, not sure about Java). This surprised me, but was discussed in another SO question.
    – user949300
    Dec 7 '18 at 16:34
  • @user949300 Java is a completely different language to C. And "too many" is "any other mention of s, irrespective of operations involved"
    – Caleth
    Dec 7 '18 at 16:36
  • @user949300 C (and C++) explicitly doesn't have rules as to what occurs. If you have ++x + x, you don't have a C (or C++) program. In general, the compiler is not required to inform you of this.
    – Caleth
    Dec 7 '18 at 16:38

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.