precedence : Java Glossary

go to home page P words local find full screen, hide local find menu Google search web for more information on this topic jump to foot of page translate this page with Babelfish 2008-04-18 by Roedy Green ©1996-2008 Canadian Mind Products
index page for letter ⇒ punctuation 0-9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z (all)
precedence
Java inherits a very complicated operator precedence scheme from C. Operators with lower precedence numbers are done first. The advantage of precedence is it means you need fewer parentheses. The disadvantage is you must memorise this table perfectly to understand what code will do. Once you learn this table you will know if:
x = a | b & c;
means:
x = ( a | b ) & c;
or
x = a | ( b & c );
Operators near the top of the table are done first. The lower the precedence number, the eariler the operations are done. Equal precedence operations usually are evaluated left to right, except for ones with right association, which are evaluated right to left. Another way of putting this is right-associated operators like ? have the deepest implied nesting on the right.
What a hodge podge!

Tips

Operator Precedence
Precedence Operator Association Notes
1 (prefix) ++
(prefix) --
(unary) + - ~ !
(cast)
Right (prefix) ++ prefix means preincrement ~ is bitwise not for ints. Preincrement increments before sampling the value to use in evaluating the rest of the expression. ! is logical not for booleans. Nearly always, you have to put the expression after ! in parentheses. You might as well make a habit of always doing it.
1 (postfix) ++ --
Right (postfix) ++ postfix means postincrement. Postincrement increments immediately after sampling the value to use in evaluating the rest of the expression. Be very careful about using a pre or post incremented variable elsewhere in an expression. You may be in for a surprise. for example
// Be very careful reusing a pre or post increment variable in an expression.
int x = 2;
int y = x++ * ++x;  // result is y = 8;

// it works as if you had coded:
int x = 2;
int a = x++;   // a=2; x=3;
int b = ++x;   // b=4; x=4
int y = a * b; // y = 8
2 * / % Left (infix) % is the remainder operator, informally and incorrectly called the modulus operator. / is integer division for ints and floating point division for doubles.
3 + - Left (infix) a - b - c means (a - b) - c not a - ( b - c ), additive operations are performed left to right. + also means concatenation.
4 << >> >>> Left (infix) There is no <<< operator because it would be identical to <<. You have to keep your wits about you when doing unsigned shifts to remember all right shifts must be done with >>>. In JDK 1.5+ the following methods are built-in letting you avoid much low-level bit fiddling: highestOneBit, lowestOneBit, numberOfLeadingZeros, numberOfTrailingZeros, bitCount, rotateLeft, rotateRight, reverse, signum and reverseBytes.
5 < > <= >=
instanceof
Left (infix)  
6 == != Left (infix) == is for comparison. != means not equal.= is for assignment. Pascal’s <> not equal will not work. == and != work on booleans too, often saving a forest of if/elses.
7 & Left (infix) Bitwise AND mostly for for ints.
8 ^ Left (infix) XOR for ints. It is the difference operator. It is true if the boolean operands are different. e.g.

false ^ false == false
false ^ true == true
true ^ false == true
true ^ true == false

It is useful in cryptography because of this magic property of encryption and decryption with a random scrambler number.

long encrypted = message ^ scrambler;
long decryped = encrypted ^ scrambler;

If you XOR twice with the scrambler, you get right back where you started. For booleans it is clearer to use a != b instead of a ^ b and a == b instead of !( a ^ b)

9 | Left (infix) bitwise OR mostly for ints.
int e = ( a & b << 2 ) | ( c & ( d >>> 1 ) );
// if you trust precedence can be written more tersely:
int e = a & b << 2 | c & d >>> 1;
10 && Left (infix) short circuit logical AND for booleans.
11 || Left (infix) short circuit logical OR for booleans. So when you say:
if ( ( ( lowest <= a ) && ( a <= biggest ) ) || notNeeded )
all those parentheses are nugatory (computer jargon for not necessary but won’t hurt). You could just as easily have written it, trusting precedence, as:
if ( lowest <= a && a <= biggest || notNeeded )
12 ? : Right (ternary)
13 = *= /= += -=
<<= >>= >>>=
&= ^= |=
Right (infix) a += b means a = a + b; a *= b means a = a * b; etc. These make proofreading easier by eliminating typing a variable name twice.
The most important extra rule is that parameters to a method are evaluated left to right.

CMP homejump to top
CMP logo
feedback Please email your feedback for publication, errors, omissions, broken/redirected link reports
and suggestions to improve this page to Roedy Green : feedback email
made with CSS
HTML Checked!
ICRA ratings logo
mindprod.com IP:[65.110.21.43]
Your face IP:[38.103.63.61] Take the DavidSuzuki.org nature challenge
You are visitor number 12,783.
You can get a fresh copy of this page from: or possibly from your local J: drive (Java virtual drive/mindprod.com website mirror)
http://mindprod.com/jgloss/precedence.html J:\mindprod\jgloss\precedence.html