Бесконечный цикл в C - PullRequest
       24

Бесконечный цикл в C

3 голосов
/ 05 февраля 2012

Начинающий здесь. Почему это бесконечный цикл?

for (p = 0; p < 5; p += 0.5)
{
    printf("p=%2.2f\n",p);
}

Ответы [ 5 ]

8 голосов
/ 05 февраля 2012

Вы видите бесконечный цикл, потому что ваш 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
}
4 голосов
/ 05 февраля 2012

Я думаю, это зависит от того, как объявлено p. Если это целочисленный тип, p всегда будет 0 (потому что результат 0 + 0.5 будет обрезаться до 0 каждый раз), поэтому for никогда не остановится.

1 голос
/ 05 февраля 2012

проблема преобразования типов, float / double теряет точность при назначении целочисленного типа.

P.S. Это действительно очень плохая идея использовать float / double в тесте условия. Не все числа с плавающей точкой в ​​компьютерах являются точными.

0 голосов
/ 05 февраля 2012

когда вы добавляете двойную константу к целочисленной переменной, двойная константа "становится" целым числом.0.5 становится просто 0. Таким образом, вы добавляете 0 к п.

0 голосов
/ 05 февраля 2012

Если p - это float или double, в коде нет ничего плохого, и цикл завершится.

Если p является целым числом, поведение кода не определено, поскольку спецификатор формата в printf() неверен.

...