Win a copy of Mesos in Action this week in the Cloud/Virtualizaton forum!

# If and parentheses

Sam Samson
Ranch Hand
Posts: 63
Hi

Could someone tell me how parentheses are virtually set in this example? Is there a simple rule like 'if there are no parentheses, the first to checks build a pair'?
I mean, will z > 1 && y >6 be together or y > 6 || z == 2?

greez
Sam

Bear Bibeault
Author and ninkuma
Marshal
Posts: 64838
86
It all has to do with the precedence of the operators.

Java operator precedence

Sam Samson
Ranch Hand
Posts: 63
Thank you, that was quick

So in my example

z > 1 && y >6 is a pair

and in:

y > 6 | z == 2 would be a pair, right?

Bear Bibeault
Author and ninkuma
Marshal
Posts: 64838
86
The easiest way to figure it all out is to use the operator precedence and start adding parentheses around the highest to lowest terms.

For example, if you started with 2 + 3 * 4, you'd end up with (2 + (3 * 4)). Give it a try.

fred rosenberger
lowercase baba
Bartender
Posts: 12124
30
• 1
And this is why you should always use parens. really, there is zero cost to adding them, and having them saves the next person reading it (which could be yourself) the trouble of having to remember the correct operator precedence.

Henry Wong
author
Marshal
Posts: 21117
78
• 1
Bear Bibeault wrote:The easiest way to figure it all out is to use the operator precedence and start adding parentheses around the highest to lowest terms.

To add to that, if you encounter two operators with the same precedence, then you use the associativity. Most go from left to right, but some goes right to left.

Henry

Bear Bibeault
Author and ninkuma
Marshal
Posts: 64838
86
P.S. I agree with fred -- for any but the most trivial of expressions, I use parens to make the meaning of the expression crystal clear.

Winston Gutkowski
Bartender
Posts: 10417
63
Sam Samson wrote:if(z > 1 && y > 6 | z == 2)

It may also be worth pointing out that a construct like y > 6 | z == 2 is extremely rare except when dealing with bit manipulation; it's almost always better to use '||'.

Winston

Stephan van Hulst
Bartender
Posts: 5811
61
All the point are very valid, but personally I also find it handy to remember a small list so you don't get too surprised when you're reading other people's code. From highest to lowest priority:

1. Dereference (array[i] and obj.foo)
2. Unary (includes casts)
3. Arithmetic (includes shifts)
4. Comparison (includes instanceof)
5. Bitwise
6. Logical
7. Assignment

For instance, this is one I frequently bump my head into: (Something)something.getFoo(); when they mean: ((Something)something).getFoo(), because dereferences (. or []) have a higher precedence than casts.