Win a copy of The Java Performance Companion this week in the Performance forum!
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

If and parentheses

 
Sam Samson
Ranch Hand
Posts: 63
IntelliJ IDE Java jQuery
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
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
Pie
Posts: 64990
86
IntelliJ IDE Java jQuery Mac Mac OS X
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
It all has to do with the precedence of the operators.

Java operator precedence
 
Sam Samson
Ranch Hand
Posts: 63
IntelliJ IDE Java jQuery
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
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
Pie
Posts: 64990
86
IntelliJ IDE Java jQuery Mac Mac OS X
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
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: 12149
31
Chrome Java Linux
  • Likes 1
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
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
Pie
Posts: 21218
81
C++ Chrome Eclipse IDE Firefox Browser Java jQuery Linux VI Editor Windows
  • Likes 1
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
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
Pie
Posts: 64990
86
IntelliJ IDE Java jQuery Mac Mac OS X
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
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
Pie
Posts: 10430
63
Eclipse IDE Hibernate Ubuntu
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
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
Pie
Posts: 5912
66
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
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.
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic