Прежде всего, поскольку цикл while (i == i + 1) {}
не изменяет значение i
, бесконечный цикл эквивалентен выбору значения i
, удовлетворяющего i == i + 1
.
.Таких значений много:
Давайте начнем с «экзотических»:
double i = Double.POSITIVE_INFINITY;
или
double i = Double.NEGATIVE_INFINITY;
Причина, по которой эти значения удовлетворяют i == i + 1
, заключается вуказано в
JLS 15.18.2.Аддитивные операторы (+ и -) для числовых типов :
Сумма бесконечности и конечного значения равна бесконечному операнду.
Это не удивительно, поскольку добавление конечного значения к бесконечному значению должно привести к бесконечному значению.
Тем не менее, большинство значений i
, которые удовлетворяют i == i + 1
, являются просто большими double
(или float
) значениями:
Например:
double i = Double.MAX_VALUE;
или
double i = 1000000000000000000.0;
или
float i = 1000000000000000000.0f;
Типы double
и float
имеют ограниченную точность, поэтому, если вы берете достаточно большое значение double
или float
значение, добавление 1
к нему приведет к тому же значению.