Как можно & ldquo; while (i == i); & rdquo; быть бесконечным циклом в однопоточном приложении?

Поскольку FALSE возвращается для «no more data» или «error», цикл while будет выполняться только до тех пор, пока он не остановится.

Более понятный способ записи:

$buffer = fgets($handle, 4096);
while( $buffer !== false )
{
    echo $buffer;
    $buffer = fgets($handle, 4096);
}

Но это не так чисто.

141
задан 5 revs, 3 users 64% 27 August 2012 в 15:55
поделиться

9 ответов

double i = Double.NaN;

API для [1 123] Double.equals () обстоятельно объясняет ответ: "Дважды. NaN == Дважды. NaN имеет ложь значения". Это разрабатывается в Спецификации языка Java под" Типы С плавающей точкой, Форматы и Значения ":

NaN не заказан, таким образом, числовые операторы сравнения <, <=, >, и >= возврат false, если или или оба операнда NaN. Оператор равенства == возвраты false, если любой операнд NaN, и оператор неравенства != возвраты true, если любой операнд NaN. , В частности, x!=x true, если и только если x NaN , и (x<y) == !(x>=y) будет false, если x или y будет NaN.

126
ответ дан Zach Scrivena 27 August 2012 в 15:55
поделиться
  • 1
    Запись сценария оболочки в Python в порядке. Если Вы хотите сделать что-то быстро кроме Вас, ненавидят синтаксис удара, просто делают это в Python. Если Вы делаете больший проект, то да, старайтесь избегать этих внешних вызовов. – Jabba 11 April 2012 в 07:10

Значение i тогда Недопустимо. "Не Число".

После некоторого гугления, я узнал, что у Вас CAN есть NaN (Не Число) в Java! Так, Плавающим числом Указания является Тип данных, и Значением является NaN. См. здесь

30
ответ дан Filip Ekberg 27 August 2012 в 15:55
поделиться

Я не уверен, но я верю (я == i), не атомарная операция в многопоточном процессе, поэтому если я оценю, то будет изменен другим потоком между нажатиями, он - значение для укладки на потоке, выполняющем цикл, тогда то условие может быть ложью.

8
ответ дан okutane 27 August 2012 в 15:55
поделиться
float i = Float.NaN;
while(i == i) ;
System.out.println("Not infinite!");
10
ответ дан Ishmaeel 27 August 2012 в 15:55
поделиться
  • 1
    Вы сделали дефектное предположение, что ничто в сети никогда не изменяется и что эти ссылки навсегда будут полезны. Сеть действительно изменяется, половина Ваших связей разорвана. При ответе на вопросы, ОТВЕТЬТЕ НА ВОПРОС. Заключение в кавычки вещей и определение источника их со ссылками прекрасны, но на самом деле выпишите ответ! – ArtOfWarfare 30 December 2012 в 05:36
double i = Double.NaN;

NaN ничему не равен, включая себя.

12
ответ дан Bill the Lizard 27 August 2012 в 15:55
поделиться

Думайте о Nan как об эквиваленте исключения, но использует волшебное значение в рамках вычисления. Поскольку неудавшееся вычисление - например, квадратный корень отрицания, разделитесь на нуль и т.д. - это не имеет никакого смысла в сравнении их против ничего больше. В конце концов, если делятся на нуль, nan, это эквивалентно квадратному корню-2 или квадратному корню-3?

Nan позволяет вычисление, которое включает шаг, который дает недопустимый ответ для завершения, не представляя дополнительные исключения. Проверить ответ - значение, просто тестируют на не nandness (это - слово, если не я складываю его в мешок) через Float.isNan () o эквивалентный.

2
ответ дан Stu Thompson 27 August 2012 в 15:55
поделиться

Я добавил бы

float i = Float.NaN;

, а также

double i = Double.NaN;
<час>

А общий прием в подобных вопросах это в предположении, Вы делаете это, я - интервал. Другие общие предположения могли бы быть s, Строка, x, y являются двойным, ch является символом, b является байтом и т.д., Если Вы видите вопрос как это, можно держать пари, что 'я' не ожидать тип.

А подобный вопрос; Это никогда не циклично выполняется, что является 'x'

while(x == x && x != x + 0) { }

Другой вопрос, который я вполне люблю; Этот цикл является бесконечным циклом, что является возможными значениями x. (: Я считаю двенадцать из них:)

while(x != 0 && x == -x) { }
2
ответ дан Peter Lawrey 27 August 2012 в 15:55
поделиться

Я знаю, что это - вопрос о Java, но рассмотрение вопроса для других языков интригует.

В C, простой тип, такой как 'интервал' мог показать 'оконечный, прежде чем вселенная вырастит холодное' поведение, если бы 'я' был объявлен как энергозависимое (таким образом, компилятор был бы вынужден сделать два чтения 'меня' для каждого повторения), и если 'я' был на самом деле в памяти, где что-то еще могло влиять на него. Тогда цикл завершился бы, когда 'я' изменился между двумя чтениями единственного повторения. ( Добавленный : возможное место - в микрокомпьютере, где 'я' на самом деле расположен в адресе порта I/O, возможно, соединилось с позиционным датчиком. Было бы более вероятно, если бы 'я' был переменной указателя (указатель на энергозависимую память), и оператор был' while (*i == *i);'.)

, Как свидетельствуется другими ответами, в C++, '==' оператор может быть предоставлен пользователем, если я имею пользовательский класс, таким образом, что-либо могло бы быть возможным.

Скорее как NaN, на основанном на SQL языке, цикл не был бы бесконечен, если бы значение я был ПУСТЫМ; однако, любое ненулевое значение сделало бы цикл бесконечным. Это скорее похоже на Java, где любое число (в противоположность NaN) делает цикл бесконечным.

я не вижу, что конструкция имеет любое практическое применение, но это - интересный вопрос о мелочах.

0
ответ дан Jonathan Leffler 27 August 2012 в 15:55
поделиться
  • 1
    Это как soln как релевантное, учитывая, что входные строки и строки кандидата все очень коротки, например, < 50 символов? – Joel 19 November 2009 в 18:49

Я был удивлен, не увидев этого решения:

while (sin(x) == sin(x)) //probably won't eval to true

В ответ на комментарий попробуйте выполнить следующее:

double x = 10.5f;
assert (x == asin(sin(x)));

x всегда должен равняться арксинусу (sin (x)) в теории, но на практике это не так.

0
ответ дан 23 November 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: