Java Reference
In-Depth Information
< Day Day Up >
Puzzle 86: Poison-Paren Litter
Can you come up with a legal Java expression that can be made illegal by parenthesizing a
subexpression, where the added parentheses serve only to document the order of evaluation that
would take place in their absence?
Solution 86: Poison-Paren Litter
It seems that inserting a pair of parentheses serving only to document the existing order of
evaluation should have no effect on the legality of a program. Indeed, this is true in nearly all cases.
In two cases, however, inserting a seemingly innocuous pair of parentheses can make a legal Java
program illegal. This strange state of affairs stems from the asymmetry of the two's-complement
binary numbers, discussed in Puzzle 33 and Puzzle 64 .
You may recall that the most negative int value has a magnitude that is one greater than the most
positive: Integer.MIN_VALUE is -2 31 , or -2,147,483,648, whereas Integer.MAX_VALUE is 2 31 - 1, or
2,147,483,647. Java does not support negative decimal literals; negative int and long constants are
constructed by prefixing positive decimal literals with the unary minus operator ( - ). A special
language rule governs this construction: The largest decimal literal of type int is 2147483648 .
Decimal literals from 0 to 2147483647 may appear anywhere an int literal may appear, but the
literal 2147483648 may appear only as the operand of the unary negation operator [JLS 3.10.1].
Once you know this rule, the puzzle is easy. The characters -2147483648 form a legal Java
expression consisting of the unary minus operator followed by the int literal 2147483648 . Adding a
pair of parentheses to document the (trivial) order of evaluation gives -(2147483648) , which
violates the rule. Believe it or not, this program really does generate a compile-time error, and the
error goes away if you remove the parentheses:
public class PoisonParen {
int i = -(2147483648);
}
The situation for long literals is analogous. This program too generates a compile-time error that
goes away if you remove the parentheses:
public class PoisonParen {
 
 
Search WWH ::




Custom Search