Java Reference
In-Depth Information
Solution 26: In the Loop
If you don't look at the program very carefully, you might think that it prints
100
; after all,
END
is
100 more than
START
. If you look a bit more carefully, you will see that the program doesn't use the
typical loop idiom. Most loops continue as long as the loop index is less than the end value, but this
one continues as long as the index is less than
or equal to
the end value. So it prints
101
, right?
Well, no. If you ran the program, you found that it prints nothing at all. Worse, it keeps running
until you kill it. It never gets a chance to print
count
, because it's stuck in an infinite loop.
The problem is that the loop continues as long as the loop index (
i
) is less than or equal to
Integer.MAX_VALUE
, but
all
int
variables are
always
less than or equal to
Integer.MAX_VALUE
. It
is, after all, defined to be the highest
int
value in existence. When
i
gets to
Integer.MAX_VALUE
and is incremented, it silently wraps around to
Integer.MIN_VALUE
.
If you need a loop that iterates near the boundaries of the
int
values, you are better off using a
long
variable as the loop index. Simply changing the type of the loop index from
int
to
long
solves the
problem, causing the program to print
101
as expected:
for (
long
i = START; i <= END; i++)
More generally, the lesson here is that
int
s are not integers.
Whenever you use an integral type,
be aware of the boundary conditions.
What happens if the value underflows or overflows? Often
it is best to use a larger type. (The integral types are
byte
,
char
,
short
,
int
, and
long
.)
It is possible to solve this problem without resorting to a
long
index variable, but it's not pretty:
Search WWH ::
Custom Search