Бесконечные циклы: int и float - PullRequest
6 голосов
/ 11 июня 2011

Я работаю над домашним заданием и, возможно, слишком переживаю из-за этого, поэтому просто ищу какой-то вклад. Вот основной код:

for(x = 100; x > 0; x = x + x) {
    sum = sum + x;

Существует две версии: одна, где x - это float, а другая - где int. Вопрос в том, являются ли эти бесконечные петли.

Я думаю, что когда x является int, оно в конечном итоге переполнится, сделав его меньше нуля, и цикл остановится. Когда x является float, x достигнет бесконечности и цикл станет бесконечным.

Я рядом?

Ответы [ 3 ]

8 голосов
/ 11 июня 2011

Поведение, когда целое число со знаком увеличивается за пределы, не определено. Таким образом, цикл может закончиться или он может быть бесконечным. Или может произойти сбой (или цикл может вообще не работать). Или, как любят говорить некоторые C-гуру, демоны могут вылететь из носа, хотя лично я сомневаюсь, что любой разработчик компилятора столкнется с проблемой реализации функциональности носовых демонов.

Что касается значений с плавающей запятой, вы правы, что это будет бесконечный цикл.

3 голосов
/ 11 июня 2011

Когда целочисленные переполнения со знаком, поведение не определено.Ожидать, что x станет отрицательным, в лучшем случае наивно.

Некоторые компиляторы (например, GCC) фактически реализуют так называемую семантику строгих значений , что означает, что компилятор использует это неопределенное поведение для целей оптимизации.В вашем конкретном примере компилятор может немедленно сгенерировать простой бесконечный цикл, то есть цикл, у которого вообще нет условий завершения.

2 голосов
/ 11 июня 2011

Вы действительно правы, целые числа будут переполнены до отрицательных значений (до тех пор, пока они подписаны), поэтому цикл завершится, и значения с плавающей запятой будут придерживаться "+ бесконечности", которая всегда больше любого числа, кроме NaN.

Изменить: Я исправлен, int версия делает цикл бесконечно (на некоторых компиляторах из-за их предположений): http://ideone.com/HZkht

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...