Win a copy of Functional Reactive Programming this week in the Other Languages 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: 65218
95
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: 65218
95
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: 12196
35
• 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: 21498
84
• 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: 65218
95
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: 10527
64
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: 6320
78
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.