Вы видите бесконечный цикл, потому что ваш p имеет целочисленный тип (например, int
). Независимо от того, сколько раз вы добавите 0.5
к int, оно останется 0, потому что int
усекает присвоенные ему значения double / fp. Другими словами, это эквивалентно циклу, в котором вы добавляете ноль на каждом шаге.
Если вы сделаете p
a float
или double
, ваша проблема исчезнет.
РЕДАКТИРОВАТЬ (предложено комментарием Оли Чарльзуорта)
Стоит отметить, что использование float и double для управления циклами не рекомендуется, потому что результаты не всегда такие же чистые, как в вашем примере. Изменение шага с 0.5
(который равен 2 на отрицательную степень 1) на 0.1
(который не является целой отрицательной степенью 2) изменило бы результаты, которые вы видите, довольно неожиданным образом.
Если вам нужно выполнить итерацию по нецелочисленному шагу, вам следует рассмотреть возможность использования этого простого шаблона:
// Loop is controlled by an integer counter
for (int i = 0 ; i != 10 ; i++) {
// FP value is calculated by multiplying the counter by the intended step:
double p = i * 0.5;
// p is between 0 and 4.5, inclusive
}